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

classParent{protectedStringvalue="123";publicStringgetValue(){returnvalue;}}publiccla... 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呢?
展开
 我来答
macholeopard
2013-08-07 · TA获得超过568个赞
知道小有建树答主
回答量:293
采纳率:0%
帮助的人:224万
展开全部
这是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构造方法用父类的就行。
s136357491
2013-08-07 · TA获得超过223个赞
知道小有建树答主
回答量:295
采纳率:0%
帮助的人:147万
展开全部

因为这是父类的方法,你想要在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());
    }
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
paladyn_gu
2013-08-07 · 超过20用户采纳过TA的回答
知道答主
回答量:104
采纳率:0%
帮助的人:59.1万
展开全部
public String getValue() {
return value;
}
在子类中重写这个方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
亲爱的玉恒
2013-08-07 · 大爱之心,至善之智,执着之行,完美之路。
亲爱的玉恒
采纳数:41 获赞数:65

向TA提问 私信TA
展开全部
因为你调用的getvalue()是父类的方法,所以调用的是父类的成员变量。不知道你为什么子类要弄一个相同的变量,如果是我 子类不会定义这个同名变量,直接用父类就是了,然后可以在构造方法中给变量赋初值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式