方法重写成员变量



我的理解是,我们不能覆盖成员变量,但当我运行下面的程序时,我会得到意外的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方法时,我得到了"parent",甚至没有parent引用。

有人能帮我理解吗?

感谢

"say"方法在父类上,而不是在子类上。因此,当它调用"消息"成员时,它会查看他自己的,而不是孩子的。这个电话是通过一个儿童班打来的,这与此无关。事实上,这里并没有覆盖成员变量。这是预期的行为。

编辑:

Java语言规范说:"如果类声明了一个具有特定名称的字段,那么该字段的声明就被认为隐藏了超类和类的超接口中具有相同名称的字段的任何和所有可访问的声明。"

"继承"并不意味着"复制"。当您在子实例上调用"say"方法时,它不是所调用方法的"代码副本",而是父类的方法,因为它在父类中定义。父类对子变量成员一无所知。

您的子类是扩展父类功能的!所以子类默认有say方法和它的值(parent),因为当您从子对象调用say方法时,父类say方法将被调用。如果您想打印"child",则需要覆盖子类中的say方法,并更改从父类扩展而来的默认特性

最新更新