Why can't my subclass access a protected variable of its superclass, when it's in a different package?
Solution 1:
It works, but only you the children tries to access it own variable, not variable of other instance ( even if it belongs to the same inheritance tree ).
See this sample code to understand it better:
//in Parent.java
package parentpackage;
public class Parent {
protected String parentVariable = "whatever";// define protected variable
}
// in Children.java
package childenpackage;
import parentpackage.Parent;
class Children extends Parent {
Children(Parent withParent ){
System.out.println( this.parentVariable );// works well.
//System.out.print(withParent.parentVariable);// doesn't work
}
}
If we try to compile using the withParent.parentVariable
we've got:
Children.java:8: parentVariable has protected access in parentpackage.Parent
System.out.print(withParent.parentVariable);
It is accessible, but only to its own variable.
Solution 2:
A little known caveat about protected:
6.6.2 Details on protected Access
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.
Solution 3:
If protected
, your instance of Join
cannot access the mStructure
in other instances (relRight
, relLeft
) outside the package.
EDIT:
The table here explains this situation fairly well. I marked the culprit in your question with []
s
Access Levels
Modifier Class Package Subclass World
public Y Y Y Y
protected Y [Y] Y N
no modifier Y Y N N
private Y N N N