动手动脑及实验性问题总结

动手实验1
通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。
父类要先通过构造函数初始化才能进行子类的初始化
子类继承父类的属性和方法,若父类部分未初始化,子类可能访问到无效状态,导致不可预测的行为。
不能反过来。若子类构造方法先执行,可能导致访问未初始化的父类成员:
子类方法若依赖父类属性,而父类尚未初始化,可能读取到默认值,引发逻辑错误。

d = m;
类型关系:m 是 Mammal 类型,而 d 是 Dog 类型。父类不能直接隐式向下转型为子类。
d = c;
类型关系:Cat 和 Dog 无继承关系,且均为 Mammal 的子类。

parent.printValue() 和 child.printValue()
parent.printValue():调用 Parent 类的 printValue(),输出 Parent 的 myValue=100。
child.printValue():调用 Child 类的 printValue(),输出 Child 的 myValue=200。
parent = child; parent.printValue()
parent = child:parent 现在指向 Child 对象(向上转型)。
parent.printValue():由于 方法动态绑定(多态),实际调用的是 Child 的 printValue(),输出 Child 的 myValue=200。
parent.myValue++
parent.myValue:虽然 parent 指向 Child 对象,但 字段没有多态,访问的是 Parent 类的 myValue(100),但 Child 类隐藏了该字段。
关键点:parent.myValue++ 修改的是 Parent 类的 myValue(从 100 变为 101),但 Child.printValue() 仍然输出自己的 myValue=200(因为字段不覆盖,而是隐藏)。
((Child)parent).myValue++
(Child)parent:显式向下转型,访问 Child 类的 myValue(200)。
myValue++:修改 Child 的 myValue 为 201,因此下一次 printValue() 输出 201。
方法重写(Override)与动态绑定
子类重写父类方法时,运行时根据实际对象类型调用方法(多态)。 示例:parent.printValue() 实际调用 Child.printValue()。
字段隐藏(Field Hiding)
子类定义与父类同名的字段时,父类字段被隐藏(非覆盖),访问哪个字段由引用类型决定。 示例:
parent.myValue 访问 Parent 的字段。
((Child)parent).myValue 访问 Child 的字段。
向上转型与向下转型
向上转型(Parent p = new Child()):安全,可隐式进行。
向下转型((Child)p):需显式转换,运行时检查类型,否则抛出 ClassCastException。
静态绑定 vs 动态绑定
字段访问:静态绑定(编译时决定,看引用类型)。
方法调用:动态绑定(运行时决定,看实际对象类型)。

zoo1不合理的地方在于只有固定数量的三种动物,如果其中有动物死亡或者添加或者动物种类的增加程序不会改变
通过在编程中应用多态,可以使我们的代码具有更强的适用性。当需求变化时,多态特性可以帮助我们将需要改动的地方减少到最低限度。

posted @ 2025-10-22 19:07  clo3o  阅读(3)  评论(0)    收藏  举报