了解班级成员的行为多态性

时间:2019-07-01 08:15:18

标签: java inheritance polymorphism

在尝试理解子类的实例时实际发生的事情时遇到了一些困难。

pm2 start -r dotenv/config dist/app.js --name appname // doesn't work

我想在这里对发生的事情进行详细的解释,但是我最不明白的是为什么行'21'打印数字1,而行'23'打印数字4。 / p>

1 个答案:

答案 0 :(得分:5)

多态适用于方法,而不适用于实例变量。

第21行和第23行均打印类A的实例变量的值,因为这是o2的编译时类型(即使其运行时类型为B)。 / p>

21. System.out.println(o2.x); 

A的{​​{1}}成员的值为x(由构造函数1设置)。

public A () { x=1; y=2; }

23. System.out.println(o2.y); 的{​​{1}}成员的值为A(由构造函数y设置)。

请注意,4有一个public B () { super(); x=3; y=4; z=5; }实例变量,它隐藏了B的同名变量。因此,x的构造函数不会将A的{​​{1}}变量更改为B。另一方面,A没有x实例变量,因此3B的{​​{1}}变量的值更改为{{1 }}。

顺便说一句,第20行出现编译错误。为了执行您的代码,我不得不将其注释掉。

还要注意,yy=4;给出的结果不同,因为A是类y覆盖的方法,因此它返回4的实例变量o2.getx(),其值为o2.x(由于getx()的运行时类型为B)。