I am having a little trouble understanding the protected access modifier in java (or the design behind it). I thought it meant package access and access through objects that inherit the class containing an abstract member.
I wrote the following sample code. I see that the commented out line produces a compilation error if uncommented. Why can I access pro through a Second object in Second but not through a First object in Second?
package first;
public class First {
protected void pro(){
System.out.println("Can see protected method");
}
}
package first;
public class InFirst {
public static void main(String[] args){
First fst = new First();
fst.pro();
}
}
package second;
import first.First;
public class Second extends First {
public static void main(String[] args){
First fst = new First();
// fst.pro();
Second sec = new Second();
sec.pro();
}
}
The webpage @MadProgrammer linked gives a decent explanation:
"The protected modifier specifies that the member can only be accessed within its own package (as with package-private) and, in addition, by a subclass of its class in another package."
This means the protected member must be accessed directly through either the class it is defined in or a subclass of said class while also being within the appropriate package. It does not necessarily mean you can access the protected member through an instance of said class created within a subclass of said class. The focus is on the packages involved.
package first; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
Attempting to access member in question from which package? first
Is the (sub)class, which contains said member, or its parent class, which it inherits the member from, defined within that same package? Yes, First
is defined in package first
, so the protected
member is accessible from First
in package first
.
package second; // Current package
First fst = new First(); // from package first and does not extend anything
fst.pro();
Attempting to access member in question from which package? second
Is the (sub)class, which contains said member, or its parent class, which it inherits the member from, defined within that same package? No, First
is defined in package first
, so protected
makes the member inaccessible from First
in package second
.
package second; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
Attempting to access member in question from which package? second
Is the (sub)class, which contains said member, or its parent class, which it inherits the member from, defined within that same package? Yes, Second
, which is defined in package second
, inherits the member from First
, so the protected
member is accessible from Second
in package second
.
package first; // Current package
Second sec = new Second(); // from package second and extends First from package first
sec.pro();
Attempting to access member in question from which package? first
Is the (sub)class, which contains said member, or its parent class, which it inherits the member from, defined within that same package? Yes, Second
inherits the member from First
, which is defined in package first
, so the protected
member is accessible from Second
in package first
.
package first; // Current package
Third third = new Third(); // from package third and extends Second from package second,
// which extends First from package first
third.pro();
Attempting to access member in question from which package? first
Is the (sub)class, which contains said member, or its parent class, which it inherits the member from, defined within that same package? Yes, Third
inherits the member from Second
, which inherits it from First
where the member is defined (package first
), so the protected
member is accessible from Third
in package first
.