继承中的私有方法

Vic*_*ung 12 java inheritance private

这是一个有趣的代码片段:

public class Superclass {

    public static void main (String[] args){
        Superclass obj = new Subclass();
        obj.doSomething(); #prints "from Superclass"
    }

    private void doSomething(){System.out.println("from Superclass");}
}

class Subclass extends Superclass {

    private void doSomething(){System.out.println("from Subclass");}

}
Run Code Online (Sandbox Code Playgroud)

我知道子类不会继承其父级的私有成员,但是obj设法调用它应该没有访问权限的方法.在编译时,obj的类型为Superclass,在运行时类型为Subclass.

这可能与doSomething()的调用发生在驱动程序类中的事实有关,这恰好是它自己的类(以及为什么可以首先调用doSomething()).

所以问题归结为,obj如何访问其父级的私有成员?

Ale*_*aer 15

私有方法仅适用于所有者.

甚至不是所有者的孩子,亲戚或朋友.


Swa*_*nil 13

你自己回答了.由于私有方法不是继承的,因此超类引用会调用自己的私有方法.

  • 关键是你要将它分配给超类引用.并且该方法是私有的,它不会被子类实现覆盖.该引用只知道一个doSomething方法,它位于超类中. (4认同)

Mar*_*eón 5

它有效是因为您正在SuperclassSuperclass. 在这种情况下,Superclass.doSomething可用于编译器。

如果您将超类和子类更改为两个不同的任意类 A 和 B,与包含该main方法的类无关,并尝试相同的代码,编译器会抱怨无法访问该方法。


Pau*_*uls 5

Superclass obj = new Subclass();
Run Code Online (Sandbox Code Playgroud)

在这一点上,obj既是事物,Subclass也是Superclass物体.您Superclass在变量声明中使用的事实只是一个问题.

当你这样做:obj.doSomething()你告诉编译器调用私有方法doSomething()obj.因为您是从内部的主静态方法执行的Superclass,所以编译器可以调用它.

如果你使用main方法Subclass而不是in方法Superclass,那么你将无法访问该方法,因为正如你所说,它既不是继承的,也不是你定义的一部分Subclass.

所以基本上你正确理解了继承.问题与私有方法的可见性有关.