2 baidu 26783335 baidu_26783335 于 2017.12.07 21:16 提问

求解答案为什么输出是father

public class Test extends Father{
private String username="test";

public static void main(String[] args) {
    Test test =new Test();
    System.out.println(test.getUsername());
}

}

class Father{
private String username="father";

public String getUsername() {
    return username;
}

}

10个回答

lyy289065406
lyy289065406   2017.12.07 21:28

成员变量是不存在重载一说的,只有方法可以重载。

Father.username 定义为 private ,这是Father 自己的成员变量, 子类是取不到的
Test.username 是 Test 自己的成员变量, 跟 Father.username 是两个变量
然后 子类Test并没有覆写 Father 的getUsername方法
于是你的main函数调用的实际是Father的getUsername, 取的是Father.username的值,自然就是输出 "father"

lyy289065406
lyy289065406 回复baidu_26783335: 不是多线程环境,有无volatile毫无影响。这是继承的知识,不是线程的知识。
7 个月之前 回复
baidu_26783335
baidu_26783335 刚刚看了看Test.class反编译之后文件,getUsername方法前加了一个volatile关键字
7 个月之前 回复
baidu_26783335
baidu_26783335   2017.12.07 21:17

答案为什么是father

qq_31150381
qq_31150381   2017.12.07 21:17

所以问题是什么。。。

qq_37102332
qq_37102332   2017.12.07 23:11

你不是返回的username

qq877988484
qq877988484   2017.12.08 09:42

子类找不到 当然去父类中找

qq_40666161
qq_40666161   2017.12.08 10:26

就是都是私有的不能被覆盖 他运行时候先找你爹 然后才会找儿子 就和学生在学校犯错了肯定的找家长一样

qq_40666161
qq_40666161   2017.12.08 10:28

还可以这么理解 儿子有100块零花钱 父亲有100块私房钱 妈妈知道需要100块钱 爸爸肯定被榨干了

Amo_lt
Amo_lt   2017.12.08 17:28

因为你并没有给test中的username写get方法,就相当于你只是定义了一个和father里面同名的变量,但是你什么操作都没有做!就相当于你的test类中并没有getUserName()方法,你的类没有,当然就会去父类找啦!如果你想要输出test,只需要在你的test类的username的下面加上:

    private String username="test";

    public String getUsername() {
        return username;
    }
baidu_26783335
baidu_26783335 既然没有重写getUsername方法,所以直接把这个方法继承过来了。所以在test中不是也应该有getUsername方法吗?
6 个月之前 回复
Amo_lt
Amo_lt   2017.12.15 17:30

回复楼主上面问的:

既然没有重写getUsername方法,所以直接把这个方法继承过来了。所以在test中不是也应该有getUsername方法吗?

给你看一篇别人写的博客:https://www.cnblogs.com/liuleicode/p/4953892.html
我觉得你的意思可能是子类继承父类,就是把父类的方法放到自己的类里面但是没有显示出来,但事实不是这样的。
如果一个子类中没有重写父类的方法a,在子类中调用了父类的方法a,那么会直接调用父类的方法a(并不是子类中有父类的该方法没有显示而已),其中的同类方法,视情况决定调用父类还是子类的。若父类的方法为private,在方法a中调用了它们,则采用父类的,因为子类没有继承,若为public或protected,则采用子类的,因为子类继承了。成员变量还是采用父类的。就好比,你继承了你父亲的一张存折,你要去银行取钱,输入的密码(成员变量)还是你父亲的,如果你改了这张存折的所有人(覆盖父类方法)(不知道可以这样改不),那么你就可以用你自己的密码(成员变量),去取钱。

Oliver_wq
Oliver_wq   2017.12.17 11:39

这个子类继承父类,创建子类对象,调用getUsername()方法,子类没有,它会从父类去找,调用父类的方法中,它获取的是父类的username属性,
所以打印的是father

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!