在尝试理解子类的实例时实际发生的事情时遇到了一些困难。
pm2 start -r dotenv/config dist/app.js --name appname // doesn't work
我想在这里对发生的事情进行详细的解释,但是我最不明白的是为什么行'21'打印数字1,而行'23'打印数字4。 / p>
答案 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
实例变量,因此3
将B
的{{1}}变量的值更改为{{1 }}。
顺便说一句,第20行出现编译错误。为了执行您的代码,我不得不将其注释掉。
还要注意,y
与y=4;
给出的结果不同,因为A
是类y
覆盖的方法,因此它返回4
的实例变量o2.getx()
,其值为o2.x
(由于getx()
的运行时类型为B
)。