私有字段是否由子类继承?

时间:2011-11-16 13:40:10

标签: java inheritance private-members

我已经读过子类不能继承私有字段或方法。但是,在这个例子中

class SuperClass {
    private int n=3;
    int getN() {
        return n;
    }
}

class SubClass extends SuperClass {
    public static void main(String[] args) {
        SubClass e = new SubClass();
        System.out.println("n= " + e.getN());
    }
}

当我运行main时,我得到的输出为n=3。似乎SubClassn继承私有属性SuperClass

所以,请解释一下这里发生了什么。谢谢。

7 个答案:

答案 0 :(得分:20)

子类'具有'其超类的字段,但不能直接访问它们。类似地,子类'拥有'私有方法,但你不能直接从子类调用或覆盖它们。

Java documentation on inheritance中,它说

  

子类继承其父类的私有成员。

但是,我认为将其视为

会更有用
  

子类继承其父类的私有成员,但无权访问它们

但这归结为语义学。

答案 1 :(得分:6)

您继承并使用getn()方法,该方法是包私有的,并且可以从子类中获取(因为在这种情况下,两者本身就在同一个包中。)您无法访问{{1}直接因为它是私人的。这是n方法可以访问getn(),因为它与n属于同一个类,并且您可以访问n方法,因为它不是私有的。

如果你这样做了:

getn()

...代替你当前的行,然后因上述原因无法编译。

通过setter / getter方法公开私有变量是完全正常的行为,这实际上就是你在这里所做的。不同之处在于,您可以在获取或设置变量时检查/限制/更改/记录/修改变量的值,并且可以在代码编译时进行重大更改。如果你只是公开一个字段并让人们直接访问它,你就不能这样做。

答案 2 :(得分:2)

这是一个值得讨论的话题。产生混淆是因为从技术上讲,子类继承了私有字段,因为私有字段存在于子类中,因此当您调用getN()时,它返回n的值。因此字段n存在于子类中。如果它不存在,那么当你调用getN()时,它会发出错误,因为字段n不存在。问题是,它确实存在,并且因为它是在超类中声明的,所以它在技术上是由子类继承的。

但是,我们(Java程序员和关于继承的java官方文档)不考虑这种继承。根据我们的约定,这不被视为继承,因为您无法直接访问这些字段的值。它几乎就像它们不是你的,因为访问它们的唯一方法是使用其他所有人(不是那个超类的子类的类)使用(getters / setters)。

因此,从概念上讲,私有字段不是继承的(尽管它们存在于子类中)。

我认为老师应该比他们更清楚地说明这一点。在深入研究之后,它确实令人困惑。

答案 3 :(得分:0)

子类只能通过publicprotected访问方法(getter,setters)访问超类的私有字段。

尝试直接访问私有变量并发现它不起作用:例如

// won't work
System.out.println("n= "+e.n+"");

答案 4 :(得分:0)

这将无法编译:

class NewExample extends Example {
    public static void main (String[] args) {
        NewExample e = new NewExample();
        System.out.println("n=" + e.n);
    }
}

因为变量声明为private,所以子类不能直接访问它。与方法相同。如果您将getn()声明为private,则您也无法访问该n。如果您希望子类可以直接访问protected int n,则可以将其声明为{{1}},并允许子类直接修改它。在许多情况下,这可能是也可能不合适。

答案 5 :(得分:0)

因为子类的对象正在父类中访问非私有的方法。并且该方法getN()返回父类的私有属性。这就是为什么要继承父类的私有属性的值。我希望这有帮助!

答案 6 :(得分:0)

这是一个很棒的话题,它让我和我的教授陷入了争吵之中。但他耐心地解释了我,证明了自己的勇气。

辅助功能与继承无关。无论访问修饰符如何,所有属性和方法都由子类继承。

虽然子类无法访问属性或方法,但它仍然继承它们!

每种编程语言都有自己对上述继承和可访问性概念的解释。