0%

java多态

这个部分我觉得稍稍有点杂,毕竟函数,属性都存在多态。考虑到向上继承,向下继承这些,调用的顺序和麻烦程度都会递增。

方法的多态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Dog extends animal{
private String food="骨头";
public Dog(String name, int age, String sex, String food) {
super(name, age, sex);
this.food = food;
}
public Dog(String name, int age, String sex) {
super(name, age, sex);
//这里就使用了多态,通过参数的不同,调用同一个函数名但有不同的效果
}
public String eat(){
return food;
}
}

这里面的两个构造函数就是多态的一种,基于传参的多态
2024/10/2 21:19:13
关于编译类型增加细节
(1)一个对象的编译类型和运行类型可以不一致
(2)编译类型在定义对象时,就确定了,不能改
(3)运行类型是可以变的
(4)编译类型看定义时 = 号的左边,运行类型看 = 号右边。
(5)属性的值看编译类型,方法看运行
(6)继承会改变运行类型

多态练习:

练习题目
对于代码:

class PolyExercise02 {
1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
Sub sub = new Sub();
System.out.println(sub.count);
sub.display();
Base b=sub;
System.out.println(b==sub);
System.out.println(b.count);
b.display();
}

首先

sub
1
2
System.out.println(sub.count);
sub.display();

只是单纯地定义新类输出方法和属性,因此都是20.此时编译类型和运行类型都是sub
Base b=sub;
则是进行了一次向上转型,此时b的编译类型Base,运行类型Sub,方法以Sub为准,属性以Base为准,因此输出false,10,20
结果如下图所示:
运行结果

System.out.println(b==sub);
判断失误,原因是这里的==判断对象是地址,
Base b=sub;
对象赋值,是给了b和sub指向一个空间的地址。

-------------本文结束感谢您的阅读-------------

总访问量
总访客数