毕业答辩的日子如命运的审判日,如期降临。云宝特意换上那件略显陈旧却洗得干干净净的衬衫,怀揣着紧张与憧憬,脚步微微发沉地迈进答辩教室。室内,五位评委如冷面判官般正襟危坐,他们的目光仿若冰冷的刀刃,齐刷刷地射向云宝,仿佛要将他看穿。
第一位评委推了推那副厚重的黑框眼镜,镜片后的目光带着一丝审视,尖声问道:“小伙子,都知道编程里有个多态性,那你就给我讲讲,在 Java 语言里,咋实现多态性的?还有,举个实实在在的例子,说说在实际项目里,这多态性能派上啥用场。” 云宝微微一怔,脑海中迅速检索知识,略一思索后,沉稳作答:“在 Java 里,实现多态性主要靠方法重载和方法重写。方法重载呢,就是在一个类里,好几个方法名字一样,但它们的参数不一样。打个比方,我们有个‘动物’类,里面有个‘叫’的方法。要是有‘狗’类继承了‘动物’类,‘狗’类里也有个‘叫’的方法,而且叫声和‘动物’类里的不一样,这就是方法重写。在实际项目中,比如做一个宠物管理系统,有‘猫’‘狗’‘兔子’等不同类,它们都继承自‘宠物’类,都有‘展示信息’这个方法,但展示的内容各有不同。这样,我们用一个‘宠物’类型的变量,就能调用不同子类的‘展示信息’方法,这就是多态性的应用。”
评委冷哼一声,不依不饶地追问:“哼,说起来容易,那实际项目里,多态性能让代码好维护、好扩展,到底咋做到的?你可别给我讲些空话。” 云宝深吸一口气,镇定回应:“通过多态,我们把不同子类相同的行为抽象到父类里。要是以后想加个新的宠物类,像‘仓鼠’类,我们只要在‘仓鼠’类里重写‘展示信息’方法就行,不用去改那些已经写好的、和其他宠物相关的代码。这样,代码结构更清楚,改起来、加新功能都方便。比如说,原来的宠物管理系统已经有了‘猫’和‘狗’的管理功能,现在要加‘仓鼠’的管理,我们只需要在‘仓鼠’类里按它的特点写好‘展示信息’方法,在主程序里用‘宠物’变量去调用,就能轻松实现对‘仓鼠’的管理,其他部分代码基本不用动。”
第二位评委清了清嗓子,带着几分挑剔的口吻提问:“数据库编程里,事务的 ACID 特性很关键。你给我说明白,这 ACID 到底是啥意思?再讲讲,在简单的转账场景里,怎么保证这 ACID 特性?” 云宝迅速整理思绪,认真解释:“ACID 就是原子性、一致性、隔离性和持久性。原子性就是说转账这事,要么全成,要么全不成。好比从 A 账户转 100 块到 B 账户,这一整个操作得是一个整体,不能 A 账户钱扣了,B 账户却没收到钱。一致性呢,就是转账前后,两个账户的钱加起来总数得一样。隔离性是保证同时进行的几个转账操作,不会互相干扰。比如说,A 给 B 转账的时候,C 给 D 转账的操作不能影响到 A 和 B 的转账。持久性就是一旦转账成功,这结果就得一直保存着,哪怕系统突然出问题了,转账记录也不能丢。”
评委皱着眉,质疑道:“高并发的时候,转账操作一个接一个,怎么保证隔离性,不让脏读、不可重复读这些问题出现?你可别含糊其辞。” 云宝不慌不忙,有条不紊地回答:“可以通过设置不同的事务隔离级别来解决。像用 READ COMMITTED 隔离级别,就能避免脏读,也就是一个事务只能读到其他事务已经提交的数据。要是用 REPEATABLE READ 隔离级别,不光能避免脏读,还能防止不可重复读,就是一个事务多次读同一个数据,结果都是一样的。在转账操作频繁,又对数据准确性要求高的情况下,我们可以选 REPEATABLE READ 隔离级别,靠数据库的锁机制,让同时进行的转账操作相互隔离,不会出错。”
第三位评委一脸严肃,抛出问题:“算法设计里,动态规划算法挺常用的。你给我讲讲,这动态规划算法到底是个啥思路?拿背包问题举例,怎么用它来解决?别给我讲得太复杂,讲清楚点儿。” 云宝认真作答:“动态规划算法,简单说,就是把一个复杂问题拆成好多小问题,这些小问题还有重叠的部分。我们把小问题的答案记下来,下次再遇到一样的小问题,就不用再算一遍,这样就能提高算法效率。就拿背包问题来说,假设有个背包,能装 10 斤东西,有 3 个物品,重量分别是 3 斤、4 斤、5 斤,价值分别是 5 元、6 元、7 元。我们要想办法把物品装进背包,让背包里物品总价值最大。我们可以建一个表格,一行一行地看每个物品装不装。比如先看第一个物品,要是背包容量是 3 斤,能装下它,就把它的价值 5 元写在表格里。要是背包容量小于 3 斤,就写 0。然后看第二个物品,要是背包容量是 4 斤,装下它,价值就是 6 元,要是装不下,就看装第一个物品的价值,选价值大的写进表格。就这样,慢慢把表格填满,最后就能知道怎么装物品,能让背包里物品总价值最大。”
本小章还未完,请点击下一页继续阅读后面精彩内容!