日期:2014-05-20  浏览次数:20765 次

继承时的困惑
创建父类和子类对象时,内存如何分配的,请高人给出此时父类和子类的堆栈图。
并解释一下父类和子类的Field是共享的吗,父类Field和子类的互相影响吗。
再看下面程序
public class Base {
int x;
Base()
{
x=5;
}
public void show()
{
System.out.println(x);
}

}




public class Sub extends Base {
Sub()
{
x=9;
}

}



public class Test {
public static void main(String[] args) {
Sub sub =new Sub();
sub.show();
Base base =new Base();
base.show();

请高人细细解答,并且当子类定义一个X时代码又怎么解释啊,最好对比着从堆栈内存角度讲解,希望有图

------解决方案--------------------
Java code
public class Test {
    public static void main(String[] args) {
        /**
         * 首先要明白子类继承父类的所有属性,但private修饰的不可以使用
         * 这里是用默认修饰,所以也能使用
         * 构造方法执行的顺序是从顶层父类一直向下执行的本类
         */
        
        /*
         * 这里当创建Sub对象时,会首先执行父类Base的构造方法,这时x被赋值为5,
         * 接着执行Sub自己的构造方法,这时x被赋值为9
         * (但当在Sub类中定义一个int x;时,赋值会采用就近原则,Sub的构造方法就是给自己类的x赋值,
         *  因此调用show方法,输出的x值还是父类给x的值,即5)
         */
        Sub sub = new Sub();
        // 这时sub调用show方法时,x就是9了
        sub.show();
        //这里创建的是父类的对象,所以只执行父类的构造方法,x被赋值为5
        Base base = new Base();
        //所以这里输出为5
        base.show();
    }
}

class Base{
    int x;    
    public Base(){
        x=5;
    }
    public void show(){
        System.out.println(x);
    }
}

class Sub extends Base{
    public Sub(){
        x = 9;
    }
}