【小白学习系列】Java编程思想第8章趟坑笔记

发布时间:2026/7/26 1:56:44
【小白学习系列】Java编程思想第8章趟坑笔记 《Java编程思想》第8章多态全部反常识高频易错点1、向上转型最普遍的认知误区误区向上转型丢失子类方法/成员反常识真相对象本体永远是子类只是引用的访问接口被收缩重写方法动态执行子类逻辑独有方法只是访问被屏蔽对象本身所有数据、方法完好无损。误区继承是为了复用代码书本核心结论继承设计首要目标是依靠向上转型实现多态、解耦代码代码复用只是附带红利。向上转型百分百安全隐式转换向下强转必须配合instanceof校验否则运行时报类型转换异常。2、绑定机制只有实例普通方法才有动态绑定多态反常识清单static静态方法无重写只有静态遮蔽静态方法绑定引用类型不看堆内真实对象父类引用指向子类对象调用静态方法永远执行父类静态代码不存在多态。final、private方法静态绑定前期绑定private默认等效final子类写同名方法属于全新方法并不是重写编译期就绑定引用类型。成员变量不存在多态变量编译期绑定引用类型父类引用读取变量永远拿到父类属性值和实际子类对象无关。3、构造器内部调用可重写方法极易触发空指针本章经典大坑构造执行顺序父类构造 → 成员变量初始化 → 子类构造体父类构造方法执行时子类的成员变量还完全没有初始化。若父类构造器调用了被子类重写的实例方法会直接执行子类重写代码此时子类字段全是默认值访问子类属性大概率NPE。硬性规范构造方法中绝对不要调用可被重写的方法。NPENullPointerException空指针异常代码去访问 / 调用一个值为 null 的对象的属性、方法程序直接报错崩溃。如下代码父构造执行阶段子类字段还是空的多态强行执行子类方法操作空变量就触发空指针 NPE。classFather{publicFather(){// 父构造调用可重写方法test();}publicvoidtest(){}}classSonextendsFather{Stringinfo;// 构造执行阶段 nullOverridepublicvoidtest(){System.out.println(info.length());// info是null执行直接NPE}}publicclassTest{publicstaticvoidmain(String[]args){newSon();}}4、清理与继承、finalize误区子类销毁时不会自动执行父类清理逻辑需要手动在子类清理方法中主动调用父类清理方法。finalize()依靠GC执行GC时机不可控不能用来释放文件、连接、句柄等系统资源GC只管堆内存回收和业务资源清理毫无关系。5、抽象类 抽象方法易错点包含抽象方法的类必须标记abstractabstract类可以拥有普通成员变量、普通实例方法、构造器。抽象类不能new实例但是拥有构造方法作用是给子类构造时完成父类成员初始化。子类继承抽象类必须实现全部抽象方法否则子类自身也要声明为abstract。6、向下转型 RTTI运行时类型识别编译器不会校验向下转型是否合法只会在运行时校验真实对象类型非法转型直接抛ClassCastException。标准安全写法转型前先用对象 instanceof 目标类判断匹配关系再做强转。向上转型抹平了具体类型想要取回子类独有功能唯一合法手段就是安全向下转型。RTTI:Run-Time Type Information运行时类型信息向上转型后父类引用屏蔽了子类真实类型Animal animal new Dog();编译期只认为 animal 是 Animal编译器看不到真实是 Dog。等到运行时JVM 依靠 RTTI 知晓这个对象本体就是 Dog我们才能安全向下转型。Java 里两种 RTTI 体现形式:传统 RTTI面向 Class 类(Dog) animal 强制向下转型运行时依靠 RTTI 校验类型类型不符抛出ClassCastExceptionanimal instanceof Dog运行时借助 RTTI 判断对象真实类型是否匹配反射机制属于 RTTI 的高级形态7、继承设计的反常识设计理念优先用组合而不是优先使用继承继承用来描述「is-a」关系组合描述「has-a」。继承用来扩展行为、实现多态单纯复用代码优先组合过度继承会造成层级臃肿、耦合严重。不要随意把类设计为可继承不需要被重写的方法建议加final关闭重写入口规避构造器多态这类隐蔽bug。8、private方法的“假重写”陷阱父类private方法子类定义一模一样签名的方法语法不会报错但并不是重写。父类引用指向子类调用该私有方法执行的永远是父类私有方法子类方法只是一个全新的独立方法无任何重写特性。题目巩固第1题单选在父类的构造方法中调用一个可被子类重写的普通实例方法会发生什么情况A. 执行父类原本的方法实现B. 执行子类重写方法子类成员变量已经完成初始化C. 执行子类重写方法子类成员变量为默认初始值极易引发空指针异常D. 编译直接报错禁止该写法正确答案C解析普通实例方法遵循动态绑定父类构造执行时会运行子类重写代码对象初始化顺序为先父类构造、再初始化子类属性、最后执行子类构造体此时子类自定义变量均为默认值引用类型为null访问极易触发NPE该写法编译不会报错属于隐藏的运行时bug。第2题单选Java中RTTI运行时类型信息的核心作用是A. 编译阶段提前校验父子类转型是否合法B. 程序运行阶段识别对象真实的所属类型C. 提升向上转型的运行效率D. 让静态方法具备多态特性正确答案B解析向下转型的合法性校验不在编译期依靠运行时RTTI完成校验RTTI作用就是运行时判定对象真实类型支撑instanceof、强制向下转型功能RTTI和运行效率优化无关静态方法为静态绑定不支持多态。第3题单选关于静态方法与重写说法正确的是A. 子类重写父类静态方法存在动态绑定支持多态B. 父类引用指向子类对象调用静态方法执行子类静态方法C. 子类同名静态方法覆盖父类该现象叫做静态遮蔽无多态D. private静态方法可以被子类正常重写正确答案C解析静态方法编译期静态绑定不存在动态绑定与多态静态方法跟随引用类型执行父类引用只会执行父类静态方法子类同名静态方法属于静态遮蔽并非真正的方法重写private方法对子类不可见无法完成重写。第4题单选向上转型的本质描述准确的是A. 将子类对象销毁新建一份父类对象B. 本体依旧是子类对象只是引用的访问接口被缩小C. 向上转型之后子类独有的方法被永久清除D. 向上转型需要手动强制转换格式书写正确答案B解析向上转型不会销毁堆中的子类实体对象仅通过父类引用屏蔽子类独有方法方法本体依然存在向下转型即可恢复调用向上转型属于隐式自动转换不需要强制书写代码。第5题单选继承的首要设计目的是A. 复用父类已有代码减少重复编码B. 依靠向上转型实现多态实现代码解耦与扩展C. 方便子类扩充成员变量D. 替代组合关系完成业务封装正确答案B解析代码复用只是继承带来的附加收益并非语言设计继承的初衷继承核心价值是依托向上转型实现多态解耦程序结构扩充属性、替代组合都不是继承的设计目标开发优先使用组合。第6题单选关于向下转型与RTTI错误的说法是A. 向下转型语法编译能够通过合法性依靠运行时RTTI校验B. 搭配instanceof判断本质就是借助RTTI获取对象真实类型C. 向上转型丢失了子类对象本体数据向下转型也无法复原D. 未经判断直接强转类型不匹配时运行抛出ClassCastException正确答案C解析向下转型仅做语法检查真实类型校验交由运行时RTTI处理instanceof底层依赖RTTI识别真实类型向上转型只会收缩访问权限子类完整数据、方法全部保留合法向下转型即可正常使用子类功能非法强制转型会抛出类型转换异常。第7题单选抽象类相关规则正确的是A. 抽象类不能拥有构造方法B. 抽象类中只能存放抽象方法不能写普通实例方法C. 子类继承抽象类若不实现全部抽象方法子类必须声明为abstractD. 使用new关键字可以直接实例化抽象类对象正确答案C解析抽象类具备构造方法作用是给子类初始化父类成员只是无法直接实例化抽象类可包含普通方法、成员变量、静态代码块等内容未实现父类所有抽象方法的子类自身必须定义为抽象类抽象类禁止使用new创建对象。第8题单选关于父类private方法子类书写一模一样方法签名的代码下列说法正确的是A. 属于方法重写具备多态特性B. 不属于重写只是子类全新的独立方法C. 父类引用指向子类会执行子类该私有同名方法D. private方法默认动态绑定正确答案B解析父类私有方法对子类不可见无法构成重写不存在多态效果子类同名方法只是自身独立方法和父类私有方法互不干扰父类引用只会执行父类的私有方法private方法等同于final采用静态绑定。第9题单选面向对象设计原则中类的功能复用优先选择下面哪一种方式A. 继承B. 组合C. 重写方法D. 向上转型正确答案B解析《Java编程思想》规范优先组合谨慎使用继承继承代表强耦合的is-a关系仅适合描述从属关系不适合单纯用来复用代码重写、向上转型都不属于代码复用的基础方案。第10题单选finalize方法以及资源释放的描述正确的是A. 依靠GC执行finalize关闭文件、数据库连接十分安全可靠B. GC只会回收堆内存空间不会主动释放操作系统各类资源C. 调用System.gc()后finalize方法必定立刻执行D. 对象内存被回收对应的文件句柄会被JVM自动释放正确答案B解析finalize执行时机不确定甚至不会执行严禁用来释放系统资源GC只负责回收堆内存文件句柄、网络连接等系统资源必须手动close关闭System.gc()只是给JVM的回收建议无法强制GC执行内存回收不会同步释放系统句柄会造成句柄泄漏问题。链接《Java编程思想》重点章节踩坑学习规划