求一个Java程序的结果,并解释

class Parent {
protected String value = "123";
public String getValue() {
return value;
}
}
public class Child extends Parent {
protected String value = "456";

static public void main(String[] args){
Child c=new Child();
Parent p=new Child();
System.out.println(c.getValue());
System.out.println(p.getValue());
}
}

经过运行,结果为
123
123

请是为什么 ?如果才能调用到子类中的456呢?

这是JAVA中典型的继承方面的问题,考点在成员变量的隐藏上。那么首先请LZ弄清继承的特性。
和这题相关的。子类继承父类后,如果名字相同,父类成员变量将会被 |隐藏|,而父类方法将被|覆盖|。
所谓|隐藏|,就是原有的变量和值仍然存在,而|覆盖|即只有新构建的方法。

这样说似乎还是混乱,那就要结合内存中的过程和情况来解释了。
首先仍然是枯燥的知识点……当调用子类构造函数构建子类对象的时候,必然会先调用父类的构造方法,即构建一个父类对象,因此父类的成员也会被构建。 然后才是子类的构建,这个时间,如果存在同名,就会依据多态原则构建。

那么看这个定义,我们就知道,只要调用了构造方法new Child(),
step1.构建了一个父类对象,虽然我也不知道怎么得到这个对象……
此时,内存中拥有了一个父类对象的方法getValue和一个成员变量value,其值是123(因为调用的父类构造方法)
step2.子类的构建。
此时要注意,因为JAVA的多态性只针对方法,所以成员变量并不会被覆盖,只会隐藏,所以内存中会有2个value,一个是父类被隐藏的value,其值是123,另一个是子类的value,其值是456.

至于此时的方法,只有一个父类的方法getValue,它被子类继承而未被覆盖。

结论:
这样的时候调用方法getValue,其实从内存中来看我们知道是调用子类继承的getValue,但说白了还是父类的getValue。
所以,对于一个对象中的方法而言,返回值肯定优先是本对象的值,虽然本对象的变量被隐藏了但并不代表不存在。
所以,输出结果是2个123.……

如果在子类中重写getValue方法,那么因为2个对象都是用的子类构造方法,那结果很有可能会是2个456,理由结合上面“结论”的内容。

不知道LZ是不是想输出一个456一个123呢?再结合结论 中的内容,很明显了,将对象p构造方法用父类的就行。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-07

因为这是父类的方法,你想要在456只能在子类中重写一个getValue方法,但这样的或由于你的c和p都是Child对象,都会输出456,所以你要改成这样

class Parent {
    protected String value = "123";

    public String getValue() {
        return this.value;
    }
}

public class Child extends Parent {
    protected String value = "456";


    public String getValue() {
        return this.value;
    }

    static public void main(String[] args) {
        Child c = new Child();
        Parent p = new Parent();
        System.out.println(c.getValue());
        System.out.println(p.getValue());
    }
}

第2个回答  2013-08-07
public String getValue() {
return value;
}
在子类中重写这个方法
第3个回答  2013-08-07
因为你调用的getvalue()是父类的方法,所以调用的是父类的成员变量。不知道你为什么子类要弄一个相同的变量,如果是我 子类不会定义这个同名变量,直接用父类就是了,然后可以在构造方法中给变量赋初值。
相似回答