I have an abstract class, relation
in package database.relation
and a subclass of it, Join
, in package database.operations
. relation
has a protected member named mStructure
.
In Join
:
public Join(final Relation relLeft, final Relation relRight) {
super();
mRelLeft = relLeft;
mRelRight = relRight;
mStructure = new LinkedList<Header>();
this.copyStructure(mRelLeft.mStructure);
for (final Header header :mRelRight.mStructure) {
if (!mStructure.contains(header)) {
mStructure.add(header);
}
}
}
On lines
this.copyStructure(mRelLeft.mStructure);
and
for (final Header header : mRelRight.mStructure) {
I get the following error:
The field Relation.mStructure is not visible
If I put both classes in the same package, this works perfectly. Can anyone explain this issue?
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.