Java中的代码
public class A {
int x;
public A() {
x = 0;
}
public void print() {
System.out.println("This is A");
}
}
public class B extends A {
int x;
public B() {
x = 1;
}
public void print() {
System.out.println("This is B");
}
}
B b = new B();
A a = b;
System.out.print(a.x);---------------->0
a.print();---------------->This is B
我很困惑。我为B类创建了对象b,虽然我将b分配给a,但我认为b仍然应该指向B类。为什么“a.x”将返回0而不是1?为什么a.x指向A中的x,但a.print()指向B中的print()方法?
答案 0 :(得分:3)
字段不是多态的,但方法是,
表示将在运行时引用引用的对象上调用方法
字段变量与引用相关联,因此如果从类x
中删除字段A
并尝试相同的代码,则无法编译
答案 1 :(得分:3)
您在Java中如何应用polymorphism时看到了一些不正常之处。在调用a.print()
调用B
' s print()
时可以看到多态性,而字段不是这种情况。该字段与引用相关联,因此在这种情况下b.x
和a.x
是不同的(尽管您可以在x
的定义中省略B
并且在超类中声明的单个字段。在这种情况下,可以看到hiding的形式。