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;
}
}
所以问题是什么。。。
答案为什么是father
成员变量是不存在重载一说的,只有方法可以重载。
Father.username 定义为 private ,这是Father 自己的成员变量, 子类是取不到的
Test.username 是 Test 自己的成员变量, 跟 Father.username 是两个变量
然后 子类Test并没有覆写 Father 的getUsername方法
于是你的main函数调用的实际是Father的getUsername, 取的是Father.username的值,自然就是输出 "father"
你不是返回的username
子类找不到 当然去父类中找
就是都是私有的不能被覆盖 他运行时候先找你爹 然后才会找儿子 就和学生在学校犯错了肯定的找家长一样
还可以这么理解 儿子有100块零花钱 父亲有100块私房钱 妈妈知道需要100块钱 爸爸肯定被榨干了
因为你并没有给test中的username写get方法,就相当于你只是定义了一个和father里面同名的变量,但是你什么操作都没有做!就相当于你的test类中并没有getUserName()方法,你的类没有,当然就会去父类找啦!如果你想要输出test,只需要在你的test类的username的下面加上:
private String username="test";
public String getUsername() {
return username;
}
回复楼主上面问的:
既然没有重写getUsername方法,所以直接把这个方法继承过来了。所以在test中不是也应该有getUsername方法吗?
给你看一篇别人写的博客:https://www.cnblogs.com/liuleicode/p/4953892.html
我觉得你的意思可能是子类继承父类,就是把父类的方法放到自己的类里面但是没有显示出来,但事实不是这样的。
如果一个子类中没有重写父类的方法a,在子类中调用了父类的方法a,那么会直接调用父类的方法a(并不是子类中有父类的该方法没有显示而已),其中的同类方法,视情况决定调用父类还是子类的。若父类的方法为private,在方法a中调用了它们,则采用父类的,因为子类没有继承,若为public或protected,则采用子类的,因为子类继承了。成员变量还是采用父类的。就好比,你继承了你父亲的一张存折,你要去银行取钱,输入的密码(成员变量)还是你父亲的,如果你改了这张存折的所有人(覆盖父类方法)(不知道可以这样改不),那么你就可以用你自己的密码(成员变量),去取钱。
这个子类继承父类,创建子类对象,调用getUsername()方法,子类没有,它会从父类去找,调用父类的方法中,它获取的是父类的username属性,
所以打印的是father