我的理解是我们无法覆盖成员变量,但是当我运行以下程序时,我意外地发现了o / p
class Parent {
String message = "parent";
void say() {
System.out.println(message);
}
}
class Child extends Parent {
String message = "child";
}
public class Test {
public static void main(String[] args) {
new Child().say();
}
}
在o / p我得到" 父母"虽然我们使用子对象调用say方法,甚至没有父引用。
任何人都可以帮助我理解它。
由于
答案 0 :(得分:1)
“say”方法在父类上,而不在子类上。因此,当它要求“消息”成员时,它会查看自己的成员,而不是孩子的成员。通过子类进行调用的事实与其无关。 实际上,这里不会覆盖成员变量。这是预期的行为。
编辑:
Java Language Specification表示“如果类声明了一个具有特定名称的字段,那么该字段的声明就会隐藏任何和所有可访问的超类中具有相同名称的字段的声明,以及超级接口上课。“
“继承”并不意味着“复制”。当您在子实例上调用“say”方法时,它不是被调用方法的“代码副本”,而是父类的方法,因为它是在父类中定义的。并且父类对子变量成员一无所知。
答案 1 :(得分:0)
你的子类是扩展父类的功能!所以子类默认使用say方法和它的值(parent),因为当你从child对象调用say方法时会调用父类say方法。如果你想打印"孩子"相反,您需要在子类中覆盖您的say方法并更改从父类扩展的默认功能。