在Java继承关系中变量访问规则
首先示例代码如下:
class A{public int x = 0;public int get() {return x;}}class AA extends A{public int x = 1;
}class AAA extends AA {public int x = 2;public int get() {return x;}public static void main(String[] args) {A a = new AA();System.out.println(a.x);System.out.println(a.get());AA aa = new AAA();System.out.println(aa.x);System.out.println(aa.get());}
}
输出结果:
0
0
1
2
解释:
在Java中,字段(或属性)的访问是基于变量的静态类型的,而方法的调用则是基于变量的实际类型(即对象的动态类型)。让我们一步一步分析这个程序的输出。
A a = new AA();
a.x:由于 a 的静态类型是 A,因此访问的是 A 类中定义的 x,它的值是 0。
a.get():这里调用的是 AA 类的 get() 方法,因为 a 实际指向一个 AA 对象。由于 AA 类没有重写 get() 方法,所以它继承了父类 A 的 get() 方法,这个方法返回的是 A 类中的 x,值为 0。
AA aa = new AAA();
aa.x:由于 aa 的静态类型是 AA,因此访问的是 AA 类中定义的 x,它的值是 1。
aa.get():这里调用的是 AAA 类的 get() 方法,因为 aa 实际指向一个 AAA 对象。AAA 类重写了 get() 方法,返回的是 AAA 类中的 x,值为 2。