为什么另一个包中的子类无法访问受保护的方法?

2022-09-02 12:17:54

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

package package1;

public class Class1 {
    public void tryMePublic() {
    }

    protected void tryMeProtected() {
    }
}


package package2;

import package1.Class1;

public class Class2 extends Class1 {
    doNow() {
        Class1 c = new Class1();
        c.tryMeProtected(); // ERROR: tryMeProtected() has protected access in Class1
        tryMeProtected();  // No error
    }    
}

我可以理解为什么调用时没有错误,因为看到此方法继承自.tryMeProtected()Class2Class1

但是,为什么 的对象不能在正在使用的对象上访问此方法?Class2Class1c.tryMeProtected();


答案 1

受保护的方法只能通过包外部子类中的继承来访问。因此,第二种方法有效。tryMeProtected();

下面的代码无法编译,因为我们不调用受保护方法的继承版本。

 Class1 c = new Class1();
 c.tryMeProtected(); // ERROR: tryMeProtected() has protected access in Class1

请点击此堆栈溢出链接进行更多说明。


答案 2

我相信你误解了和可见性之间的区别。packageprotected

package package1;

public class MyClass1 {
    public void tryMePublic() { System.out.println("I'm public"); }
    protected void tryMeProtected() { System.out.println("I'm protected"); }
    void tryMePackage() { System.out.println("I'm package"); }
}
  • tryMePublic无论您身在何处,都可以访问。
  • tryMeProtected同一包中的每个子类和每个类都可以访问。
  • tryMePackage同一包中的每个班级都可以访问(如果儿童班级位于不同的包裹中,则不可用)

同一套餐中的儿童班

package package1;

public class Class2 extends MyClass1 {
    public void doNow() {
        tryMePublic(); // OK
        tryMeProtected(); // OK
        tryMePackage(); // OK
    }    
}

不同套餐的儿童班

package package2;

import package1.MyClass1;

public class Class3 extends MyClass1 {
    public void doNow() {
        MyClass1 c = new MyClass1();
        c.tryMeProtected() // ERROR, because only public methods are allowed to be called on class instance, whereever you are
        tryMePublic(); // OK
        tryMeProtected(); // OK
        tryMePackage(); // ERROR
    }    
}

推荐