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

use*_*848 13 java protected subclass modifier package

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

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
    }    
}
Run Code Online (Sandbox Code Playgroud)

我可以理解为什么在调用时没有错误,tryMeProtected()因为Class2它继承了这个方法Class1.

但是,为什么是不是有可能的对象Class2访问此方法的对象上Class1使用 c.tryMeProtected();

Ank*_*hag 14

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

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

 Class1 c = new Class1();
 c.tryMeProtected(); // ERROR: tryMeProtected() has protected access in Class1
Run Code Online (Sandbox Code Playgroud)

请按照此stackoverflow链接获取更多说明.

  • 在同一个包中,它们可以通过单独的实例访问,因为它与 java 中的默认可见性相同(除了可以在包外继承的子类)。 (2认同)

Ant*_*ond 11

我相信你误解了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"); }
}
Run Code Online (Sandbox Code Playgroud)
  • tryMePublic 随时随地都可以访问.
  • tryMeProtected 每个子类和同一个包中的每个类都可以访问.
  • tryMePackage 将在同一个包中的每个类都可访问(如果它们在不同的包中,则不在子类中提供)

儿童班在同一个包中

package package1;

public class Class2 extends MyClass1 {
    public void doNow() {
        tryMePublic(); // OK
        tryMeProtected(); // OK
        tryMePackage(); // OK
    }    
}
Run Code Online (Sandbox Code Playgroud)

儿童班在不同的包

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
    }    
}
Run Code Online (Sandbox Code Playgroud)