Java 包访问类|(公共和受保护的不同)

Java 包访问类|(公共和受保护的不同),java,Java,如果我有一个package访问类,比如: package AA; class A { // ... } 它只能由包AA上的类访问。在此类方法上声明为受保护的或公共的有什么区别? 是不是因为类仅从其包访问,所以它是相同的?包AA可能有一个扩展了a的公共类B 在这种情况下,来自不同包的类C可以创建B的实例,并为该实例调用a的任何公共方法 但是,如果将A的方法定义为受保护的,则C必须是B的子类才能调用这些方法 package AA; class A { public

如果我有一个package访问类,比如:

package AA;

class A {    
  // ...    
}
它只能由包
AA
上的类访问。在此类方法上声明为受保护的或公共的有什么区别?
是不是因为类仅从其包访问,所以它是相同的?

包AA可能有一个扩展了a的公共类B

在这种情况下,来自不同包的类C可以创建B的实例,并为该实例调用a的任何公共方法

但是,如果将A的方法定义为受保护的,则C必须是B的子类才能调用这些方法

package AA;
class A 
{
    public void foo() {}
    protected void bar() {}
}

package AA;
public class B extends A 
{

}

package BB;
public class C extends B
{
    public void func ()
    {
        super.bar (); // OK, since bar is protected and C extends B
                      // which extends A
    }
    public static void main (String[] args)
    {
        B b = new B();
        b.foo(); // OK, since foo is public
        b.bar(); // doesn't compile, since bar is protected
    }
}

使用反射时会有所不同,例如Class.getMethods()

C
的不同包限制很重要,从同一个包中,
C
也可以访问受保护的
字段/方法,而无需扩展
A
B
。(
protected
包括包私有访问。)@GáborBakos是的,这就是为什么在我的示例中C位于不同的包中。