私人成员和继承

时间:2014-11-23 17:40:29

标签: java inheritance

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

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,我感到困惑,因为它看起来像是参考b的对象现在有变量length,它的值是32.但参考{{1引用从类b创建的对象,其中未定义B变量。 那么真相是什么,班级length是否会继承B变量private?如果是这样,length变量不会被继承是什么意思?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

嘿,这不是你的想法,私人领域只能通过同一个类中存在的方法访问(给出的方法可以从其他类访问)

不是你可以直接打电话:

b.length=8;

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

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

这两种方法都无效!

欲了解更多信息:

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

答案 2 :(得分:-1)

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

这是面向对象编程的基本概念之一,它被命名为 Encapsulation 。 请在此处详细了解:TutorialsPoint

底线 :您无法直接访问此类私人字段或方法

b.length = 32;

也不喜欢(对于超类)

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

但你可以通过使用像你的例子中的公共方法来操纵这些字段。

原因很简单:您的隐私字段/方法隐藏其他类除了持有它们的类,但您的<强>公共字段/方法不会被隐藏。