Java继承中的私有成员

Man*_*y M 8 java inheritance subclass private-members superclass

我被告知,对于Java子类,它可以继承其超类的所有成员.这甚至意味着私人会员呢?我知道它可以继承受保护的成员.

谁可以给我解释一下这个.我现在完全糊涂了.

Ken*_*nde 22

这种取决于你对继承这个词的确切用法.我会举例解释.

假设您有两个类:ParentChild,其中Childextends Parent.此外,Parent还有一个名为的私有整数value.

现在问题是:Child继承私有value吗?在Java中,继承的定义方式是答案为"否".然而,在一般的OOP术语中,存在轻微的模糊性.

你可以说它没有继承,因为没有地方可以Child明确地引用value.即任何代码this.value都不能在其中使用Child,也不obj.value能从某些调用代码中使用(显然).

但是,从另一个意义上说,你可以说这value 继承的.如果您认为每个实例Child也是一个实例Parent,那么该对象必须包含其中value的定义Parent.即使Child类对此一无所知,名为的私有成员value仍然存在于每个实例中Child.所以在这个意义上,你可以说这value是继承的Child.

因此,不使用"继承"一词,只需记住子类不了解父类中定义的私有成员.但是请记住,那些私有成员仍然存在于子类的实例中.


sgo*_*les 19

不,私有成员不会被继承,因为私有成员的范围仅限于定义它的类.仅继承public和protected成员.

来自Java Documentation,

超级私人会员

子类不继承其父类的私有成员.但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法.嵌套类可以访问其封闭类的所有私有成员 - 包括字段和方法.因此,子类继承的公共或受保护嵌套类可以间接访问超类的所有私有成员.

来自JLS,

声明为private的类的成员不会被该类的子类继承.只有声明为protected或public的类的成员才会被声明在声明类之外的包中声明的子类继承.

一个有用的链接:子类是否继承私有字段?

  • 澄清一下,子类的所有字段和方法仍然存在,但它们只能通过可以访问它们(或反射)的非私有方法间接访问 (5认同)

小智 5

您会在这里 100% 满意。我在我的电脑上测试了它,我得出的结论是我要把它贴在这里。只需通过下面编写的程序,查看程序输出并阅读最后给出的结论。要自己测试,请复制整个程序并将其保存在名为“InheritanceTest.java”的文件中,然后编译并最终运行它。

程序

// Testing if a subclass can access the private members of a superclass

class Class1 {
    private String name;

    public void setName(String name) {
        this.name = name;
        System.out.println("The name has been set successfully.");
    }

    public void showName() {
        System.out.println("The name is: " + name);
    }
}

class Class2 extends Class1 {
    private int age;

    public void setAge(int age) {
        this.age = age;
        System.out.println("The age has been set successfully.");
    }

    public void showAge() {
        System.out.println("The age is: " + age);
    }

    public void displayName() {
        //Accessing the private member of superclass here
        //System.out.println("The name is: " + name); //error, can't compile because access to the private member name of the superclass Class1 is not permitted here.
    }
}

class InheritanceTest {
    public static void main(String[] args) {

        Class1 c1 = new Class1();
        Class2 c2 = new Class2();

        c1.setName("Name_C1");
        c2.setName("Name_C2"); //No error, setName() is a public member of the superclass which indirectly gives access to the private member "name".

        c1.showName();
        c2.showName(); //No error, showName() is a public member of the superclass which indirectly gives access to the private member "name".

        c2.setAge(25);
        c2.showAge();

        //c2.displayName(); //error
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

The name has been set successfully.
The name has been set successfully.
The name is: Name_C1
The name is: Name_C2
The age has been set successfully.
The age is: 25
Run Code Online (Sandbox Code Playgroud)

结论

是的,子类可以间接访问超类的私有成员。子类不能直接访问超类的私有成员。

超类的所有public、private 和protected 成员(即所有字段和方法)都由子类继承,但子类只能直接访问超类的public 和protected 成员。如果从超类继承的成员可以访问超类的私有成员,则子类可以使用此继承成员访问超类的私有成员。