使用子类对象的继承方法返回父类变量

时间:2019-05-29 14:27:17

标签: java

父类和子类具有相同的变量“名称”,已通过继承方法-父类中的getName()访问了

class A {
    String name = "A";
    String getName() {
        return name;
    }
    String greeting() {
        return "Class A";
    }
}

class B extends A {
    String name = "B";

    String greeting() {
        return "Class B";
    }
}

public class Client {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        System.out.println(a.greeting() + " has name " + a.getName());
        System.out.println(b.greeting() + " has name " + b.getName());
    }
}

输出:

  

A类的名称为A
  B类的名称为A

在上面的代码段中,b.getName()使用子类引用对其进行访问,但将输出返回为“ A”。有人可以解释一下吗?

注意: 我已经访问了此链接-Overriding member variables in Java ( Variable Hiding),在该链接中,使用引用直接访问变量。在上面的给定代码段中,可以通过继承的方法对其进行访问,该方法使用父类变量来生成输出,尽管可以通过“子类引用”和“子类对象”进行调用。

1 个答案:

答案 0 :(得分:0)

参考-https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#d5e10238 部分-示例8.3.1.1-3

B类现在有两个变量

  • 字符串名称=“ A”->来自类A
  • 字符串名称=“ B”->来自类B (但这会隐藏上面的内容,不能直接调用)

假定以下类引用:

A a = new A();
B b = new B();

  • 可以通过以下方式获取字符串名称=“ A”:super.namea.namea.getName()
  • 可以通过以下方式获得字符串名称=“ B”:b.name或覆盖类B中的getName()方法

考虑到给定的代码段

  1. 我们正在从类B的父类A调用继承的方法getName()
  2. 此继承的方法仅知道类A中的实例变量“名称”
  3. 因此,它指向类B中的String name =“ A”,因为类B包含了两者,并且输出为“ A”,尽管类引用和对象的类型为'B'