为什么以下继承的方法使用超类成员

时间:2014-04-23 14:05:16

标签: java

请原谅我的无知。以下代码输出

A1 has name A1
B1 has name A1

但我期待

A1 has name A1
B1 has name B1

as String name在子类中重新定义。谁能解释一下?

  

代码段:

public class Client {
    public static void main(String[] args) {
        A1 a = new A1();
        A1 b = new B1();

        System.out.println(a.greeting() + " has name " + a.getName());
        System.out.println(b.greeting() + " has name " + b.getName());
    }
}


class A1 {
    String name = "A1";

    String getName() {
        return name;
    }

    String greeting() {
        return "class A1";
    }
}


class B1 extends A1 {
    String name = "B1";

    String greeting() {
        return "class B1";
    }
}

3 个答案:

答案 0 :(得分:2)

通过在子类中声明一个与父类中声明的变量同名的变量,您可以隐藏父类中的变量。子类中的变量是与父类中具有相同名称的变量不同的变量。您可以尝试这样的事情:

class B1 extends A1 {
    public B1(){
       name = "B1";
    }

    String greeting() {
        return "class B1";
    }
}

答案 1 :(得分:1)

您不能覆盖getName,因此来自B1的{​​{1}}使用A1实施,它会从name返回一个字段A1,并且无法访问name中的B1。如前所述,这称为变量隐藏

答案 2 :(得分:0)

这是一个Oracle JavaDoc,它更详细地介绍了用Java覆盖和隐藏的内容。

http://docs.oracle.com/javase/tutorial/java/IandI/override.html

另见SO文章,关于覆盖Java实例变量

Is there a way to override class variables in Java?

我认为这应该有助于解释为什么会发生这种情况,它主要与您如何实例化变量有关。