【问题标题】:Private members and inheritance [duplicate]私有成员和继承[重复]
【发布时间】:2015-01-21 09:55:54
【问题描述】:

我在一本教科书中读到,标记为私有的类成员不会被继承。 所以我想如果A 类有一个private 变量xB 类将扩展A 类,那么B 类中就不会有变量x。 但是,以下示例表明我误解了这一点:

public class testdrive
{
    public static void main(String[] args) {
        B b = new B();
        b.setLength(32);
        System.out.print(b.getLength());
    }
}

class A {
    private int length;
    public void setLength(int len) {
        length = len;
    }
    public int getLength() {
        return length;
    }
}

class B extends A {
    public void dummy() {
    }
}

结果是 32,我很困惑,因为它看起来像带有 ref b 的对象现在有变量 length,它的值是 32。但是 ref b 指的是从类 B 创建的对象,其中length 变量未定义。 那么真相是什么,B 类是否继承了private 变量length?如果是这样,private变量没有被继承是什么意思?

【问题讨论】:

  • 不要在你的标题中添加“Java”,你已经用java标记了你的问题。

标签: java inheritance


【解决方案1】:

private 的字段隐藏在 B 中。但是,您的 public 方法是继承的并且是可访问的,并且它们可以访问私有字段。

【讨论】:

    【解决方案2】:

    嘿伙计,这不是你想的那样,私有字段只能被同一个类中存在的方法访问(当然,这些方法可以从其他类访问)

    不是你可以直接调用:

    b.length=8;
    

    或者你甚至不能这样做:(写在你为B创建对象的地方)

    A a = new A();
    a.length=8;
    

    这两种方法都无效!

    更多信息:

    你甚至不需要从 A 扩展 B,只需在 main 中创建一个 A 的对象并使用你的 get 和 set 方法,它也可以工作!

    【讨论】:

      【解决方案3】:

      您不能直接访问超类的私有字段和方法,但可以通过使用其他公共方法来访问它们。

      这是面向对象编程的基本概念之一,它被命名为封装。 在此处阅读更多信息:TutorialsPoint

      底线:您不能直接访问这样的私有字段或方法

      b.length = 32;
      

      也不是这样(对于超类)

      A a = new A();
      a.length = 32;
      

      但您可以通过使用示例中的公共方法来操作这些字段。

      原因很简单:您的 private 字段/方法对于其他类除了拥有它们的类隐藏,但是您的 private strong>public 字段/方法未隐藏。

      【讨论】:

      • 问题不在于 getter/setter 是如何工作的,而是为什么 length 字段在 B 类中是 inheritedaccessible 如果private字段不被继承。
      • 我编辑了帖子并纠正了我的错误。感谢您的回复!:)
      猜你喜欢
      • 2020-09-04
      • 1970-01-01
      • 2020-09-01
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      • 2013-02-12
      相关资源
      最近更新 更多