继承,子类和父类是共享同一变量。抛开Java的内存组织不谈,单从实际运行的角度来讲,JVM也不会维护两份拷贝。试想,假设子类和父类各自拥有自己变量的引用,会出现什么情况?如果父类在某个方法中对a的值做了改变,那么,由于子类是继承的父类的a,它要保持自己的a和父类的a的一致性,于是父类的a在发生改变的时候,势必会引起对子类的a的同步。子类发生改变的时候,也会引起父类的同步。这显然是不合理的,Java的设计师们不会做这种无畏的牺牲。所以,对继承,子类和父类对同一变量总是使用同一个引用。如下的程序段:
class A
{
public int a = 0;
void pa()
{
System.out.println(a);
}
}
class B extends A
{
void pa()
{
System.out.println(a);
a++;
super.pa();
}
}
如果用"new B().pa()"调用来查看运行结果,会打印出0和1.就是说,子类变化,父类也跟着变化了。
如果是继承并覆写,则是另一种情况:
class C extends A
{
public int a;
void pa()
{
System.out.println(a);
a++;
super.pa();
}
}
C继承了A的变量a,但是覆写了它。这时候,A的a和C的a就不一样了。使用“new C().pa()”调用来查看运行结果,会打印出两个0.
class Children extends Father {
void cal() {
++x;
System.out.println("x of class Father: " + super.x);
System.out.println("x of children: " + x);
}
}
public class test {
public static void main(String[] args) {
new Children().cal();
}
}
输出:
x of class Father: 1
x of children: 1
Press any key to continue...
这样明白了吧