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