我需要澄清Java的动态多态性.
class Foo {
int a=3;
public void display() {
System.out.println(" in foo "+a);
}
}
class Bar extends Foo {
int a=8;
public void display() {
System.out.println(" in boo "+a);
}
}
public class Tester {
public static void main(String[]args) {
Foo f = new Bar();
f.display();
System.out.println(f.a);
}
}
Run Code Online (Sandbox Code Playgroud)
这里当我创建一个带有基类引用的子类对象时,在调用该方法时f.display()它会将输出作为in boo 8.这是因为动态多态性在运行时检查对象类型以调用方法.
现在在打印f.a时打印3因为变量无法在java中被覆盖,这称为隐藏.这就是为什么它显示基本变量值而不是子变量值.
现在我的问题是f是基类的引用,它指向子类对象.那么如何f.a指向基本变量.场景背后会发生什么?引用如何指向基类?
(我知道规则,但我想知道如何/为什么?)
class Foo {}
class Boo extends Foo {}
public class Tester {
public static void main(String[]args) {
Foo f = new Foo();
Boo b = new Boo();
System.out.println("****"+f==b+"****");//line 1
boolean flag = f==b;
System.out.println("****"+flag+"****");//line 2
}
}
Run Code Online (Sandbox Code Playgroud)
对于line1输出,false
对于line2输出,****false****
对于第2行,它正确连接.
我的问题是为什么第1行它只是打印值而不是正确的星形输出.