The keyword protected grants access to classes in the same package and subclasses (http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html).
Now, every class has java.lang.Object as superclass (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html).
Hence I conclude that every class may access java.lang.Object‘s methods even if they are protected.
Take a look at the following example:
public class Testclass { public Object getOne() throws CloneNotSupportedException { return this.clone(); } public Object getTwo() throws CloneNotSupportedException { return ((Object) this).clone(); } }
While getOne() compiles fine, getTwo() gives
Testclass.java:6: clone() has protected access in java.lang.Object return ((Object) this).clone();
I neither understand why getTwo() doesn’t compile nor what’s the difference (regarding the access of java.lang.Objects members) with getOne().
You can only access protected members of a type in a different package if the compile-time type of the expression you’re referencing it through is either your own class or a subclass. (Where ‘your’ class is the class containing the code.) Your own class has to be a subclass of the type which originally declares the method, too.
Here’s an example; assume that
Baseis in a different package to all the other classes:In other words, it’s letting you have access to the protected members of ‘objects which are a like you’.
Details are in section 6.6.2 of the Java Language Specification: