这个部分我觉得稍稍有点杂,毕竟函数,属性都存在多态。考虑到向上继承,向下继承这些,调用的顺序和麻烦程度都会递增。
方法的多态
1 | class Dog extends animal{ |
这里面的两个构造函数就是多态的一种,基于传参的多态
2024/10/2 21:19:13
关于编译类型增加细节
(1)一个对象的编译类型和运行类型可以不一致
(2)编译类型在定义对象时,就确定了,不能改
(3)运行类型是可以变的
(4)编译类型看定义时 = 号的左边,运行类型看 = 号右边。
(5)属性的值看编译类型,方法看运行
(6)继承会改变运行类型
多态练习1
对于代码:
1 | public static void main(String[] args) { |
首先123都只是单纯地定义新类输出方法和属性,因此都是20.此时编译类型和运行类型都是sub
1 | System.out.println(sub.count); |
直到4进行了一次向上转型,此时b的编译类型Base,运行类型Sub,方法以Sub为准,属性以Base为准,因此我认为输出时false,10,20。结果如下图所示:
对System.out.println(b==sub)判断失误,原因是这里的==判断对象是地址,代码:Base b=sub 的对象赋值的本质是给了b和sub指向一个空间的地址。我姑且理解为以后在对两个对象进行判断时,考虑地址是否指向同一个东西
#多态练习2#
这里提到了个很重要的动态绑定机制,