我明白了a.get()
返回20的原因,这是因为动态绑定,因为B对象是在运行时创建的,所以它在类B中调用get()
但是a.x
为什么打印10张?
class A {
int x = 10;
int get() {
return x;
}
}
class B extends A {
int x = 20;
int get() {
return x;
}
}
class Main {
public static void main(String[] args) {
A a = new B();
System.out.println(a.get()); //20
System.out.println(a.x); //10
}
}
如果您还可以在此处解释用于存储对象的内存。
答案 0 :(得分:5)
仅仅因为在Java中,只有方法才是多态的,而不是字段。引用字段时,编译器将使用声明的类型。引用方法时,运行时动态调度将选择正确的多态操作。
答案 1 :(得分:0)
最好的考虑方法是对象a是A类型。但是由于声明的方式,它可以“窃取” B类中的函数,并且如果它们重叠,则可以这样做。
由于a为A类型,因此调用a.x将返回存储在A类中的公共变量“ x”。由于在此过程中它永远不必引用B中的方法,因此它将引用A类中的x,而不是B类中的x。
但是,当您调用a.get()时,它将调用B类的a.get(),该类将获取B类中定义的x = 20。
让我知道是否有帮助!
答案 2 :(得分:0)
关于Java中的对象,声明类型与实际类型之间存在区别。在这种情况下,对象a是声明的类型,而对象b是实际的类型。一种考虑的方法是,在子类中的Override方法上调用时,将执行声明类型的方法。 x是因此在此方面不受多态行为影响的a类字段。 更多关于实际和声明类型的信息: http://ice-web.cc.gatech.edu/ce21/1/static/JavaReview-RU/OOBasics/ooPoly.html
关于堆栈中的内存,变量a的存储桶指向字段x的值为20的B类对象。不确定是否能回答您的内存问题。