I have gone through so many websites which explains about access specifiers in java such as java papers, java's access specifiers, and many other stackoverflow questions like here.
All these guys explained that the protected member can be accessed by any subclass(also by the subclass out of package) and can be accessed by the package level classes.
While experimenting on protected members, I found out that I'm unable to access a protected member from a subclass outside package.
Check the code below. A public class with protected members:
package com.One;
public class ProVars {
protected int i = 900;
protected void foo()
{
System.out.println("foo");
}
}
Another public class in different package trying to access protected member:
package com.Two;
import com.One.ProVars;
public class AnotherClass extends ProVars {
public static void main(String[] args) {
ProVars p = new ProVars();
System.out.println(p.i);//the field ProVars.i is not visible(Compilation Error)
p.foo();//the method foo() from the type ProVars is not visible
}
}
Any explanation is appreciated.
We cannot access the protected members of a class in a class (non-subclass) that is present in a different package.
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.
Protected variables are those data members of a class that can be accessed within the class and the classes derived from that class. In Python, there is no existence of “Public” instance variables. However, we use underscore '_' symbol to determine the access control of a data member in a class.
protected means access to the method is restricted to the same package or by inheritance. So the answer is, yes, protected methods can be overridden by a subclass in any package.
You're attempting to use them as if they were public
. They are not public
, they are protected
.
Example
ProVars p = new ProVars();
p.foo(); // This will throw an error because foo() is not public.
The correct usage, for a subclass to use a protected
method or variable is:
public class MyClass extends ProVars
{
public MyClass()
{
System.out.println(i); // I can access it like this.
foo(); // And this.
}
}
Why does this work?
Because you've inherited
the class. That means you've got all of its methods and it's variables. Now, because your method and variable is protected
, it also means that it can be accessed from the subclass
. Try and declare them as private
and see what happens.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With