【问题标题】:Extends hierarchy about private members in parent class扩展父类中私有成员的层次结构
【发布时间】:2014-04-30 08:10:01
【问题描述】:

下面有两个类:

public class Animal {
    private String name;
    public Animal(String name) {
         this.name = name;
    }
    public String getName() {
         return name;
    }
}

public class Cat extends Animal {
    public Cat(String name) {
         super(name);
    }
    public static void main(String[] args) {
         Cat cat = new Cat("Tom");
         System.out.println(cat.getName());
    }
}

结果是“汤姆”。

但是值是Animal还是Cat的属性值?如果是动物,为什么猫能得到它?

【问题讨论】:

    标签: java class extends


    【解决方案1】:

    属性name 虽然在Animal 中声明了private 仍然在Cat 中继承。但是,我们无法直接访问它,即您不能将name. 运算符一起使用,例如cat.name = "Jerry"。但是,由于方法getName 是在Animal 中声明的,因此可以访问Animal 的私有成员。另外getNamepublic,所以我们可以在Cat 中访问它。

    这意味着我们正在访问子类中的超类的private 成员。这很明显。您可能对此感到困惑,因为很多

    如何将name 设置为Tom: - 通过Animal 的公共构造函数设置name。而Cat 的构造函数将name 的值传递给Animal 构造函数,然后由它设置。

    编辑:当你说Cat cat = new Cat("Tom");时,这意味着你只创建了一个对象。 Cat 的对象。您尚未创建 Animal 的对象。虽然调用了Animal 的构造函数,但它并没有创建Animal 的实例。在上述情况下,属性name 属于Cat 的实例,而不是Animal

    【讨论】:

    • Rahul Bobhate,值“Tom”属于 Cat 或 Animal 的实例?我不知道“Tom”在哪里?动物的实例?猫?
    • @DigengTianhan:编辑了答案。
    【解决方案2】:

    Animal 有一个私人成员name;由于Cat的构造函数调用了存储名字的Animal的构造函数,AnimalgetName可以返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2016-08-26
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多