Don’t know the rationale, but JLS confirms this in 6.6.2. Details on protected Access (emphasis mine):
A protected member or constructor of an object may be accessed from outside the package in which it is declared only by code that is responsible for the implementation of that object.
So:
package P2;
public class P2 {
protected void foo() {}
}
.........
package P2A;
class P2A extends P2.P2 {
void bar(P2.P2 other) {
this.foo(); // OK
other.foo(); // ERROR
}
void bar2(P2A other) {
other.foo(); //OK
}
}
In P2A.bar
a call to this.foo()
is accessible because this
is responsible for implementation of P2
but other.foo()
is not accessible because other
may not be a P2A
. bar2
on the other hand has a P2A
so it is all good.
Now, why all is OK if they are all the same package but not if they are different packages? What is the rationale? I don’t know and would like to know.
Meta-Comment I have rolled back a recent update by another user as it substantially changes the answer and is probably more suitable as a top level answer itself.