这段代码的结果取决于引用变量的类型,这是否意味着变量(int a)以静态方式有界
class A{
int a = 10;
}
public class Main extends A {
int a = 30;
public static void main(String[] args){
A m = new Main();
System.out.println("A : " + m.a);
}
}
这与static
或dynamic binding
不同。Java中fields
没有polymorphism
,只有methods
。
变量的决定总是在compile-time
。
因此,在upcasting
基类期间变量将被占用。
您声明的变量m
是A
类型,因此输出将是10
。相反,如果将m
初始化为Main m = new Main();
,那么输出将是30
。这是因为,对象的类型是Main
,因为Main
也有一个字段a
,这将覆盖父字段a
。
你有两个对象的类型(A, Main
),它们对变量a
都有自己的含义,所以当你的变量m的类型是A
时,你会得到值10
,如果变量m的类型是Main
,你会得到值30
。