Java - 为什么另一个包中的子级无法通过父级引用访问父级的受保护方法?

Deb*_*ALI 4 java inheritance protected access-modifiers package

我在两个不同的包中有两个类:

package package1;

public class ParentClass {
    public void testPublic() {
    }

    protected void testProtected() {
    }
}


package package2;

import package1.ParentClass;

public class ChildClass extends ParentClass {
   void test() {
        ParentClass par = new ParentClass();
        par.testProtected(); // Line 1 : ERROR: testProtected() has protected access in ParentClass
        testProtected();     // Line 2 : No error

        ChildClass ch = new ChildClass();
        ch.testProtected(); // Line 3 : No ERROR
        testProtected();    // Line 4 : No error
    }    
}
Run Code Online (Sandbox Code Playgroud)

我能够理解为什么调用时没有错误testProtected() -- Line 2,因为ChildClass看到这个方法继承自ParentClass.

并且能够以某种方式理解为什么它在调用中抛出错误par.testProtected() -- Line 1,因为par它是一个不同的对象,并且当前对象无法访问其他对象的父对象的受保护方法。

ch.testProtected() -- Line 3但是,当引用类型仅为 ChildClass 时,ChildClass 的对象如何访问相同的方法(其他对象的父对象的受保护方法)?

lea*_*iro 6

您看到的错误完全有道理。

当您执行以下操作时

ParentClass par = new ParentClass();
par.testProtected();
Run Code Online (Sandbox Code Playgroud)

您正在尝试访问,testProtected就好像它是 的公共 API 的一部分一样ParentClass,就是这样,您正在从另一个包调用ParentClass 该类的实例上的受保护方法。在扩展类中调用它并不重要,重要的是它是从另一个包中调用的。

现在,如果你这样做

ChildClass ch = new ChildClass();
ch.testProtected(); // Line 3
testProtected();    // Line 4
Run Code Online (Sandbox Code Playgroud)

您不会看到任何错误。为什么?

在第 3 行中,您正在访问inside类实例的ChildClassChildClass方法,因此这是合法的。即使您有一个私有方法,您也可以childMethod这样ChildClassch.childMethod()

在第 4 行中,您testProtected通过this引用(隐式)访问,这意味着它通过 调用该方法ChildClass,这也是合法的。

请参阅此相关帖子:Java 中 public、protected、package-private 和 private 之间的区别是什么?(提示:所描述表格的最后一行)