Ключевое слово protected предоставляет доступ к классам в одном пакете и подклассах (http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html).
Теперь каждый класс имеет java.lang.Object как суперкласс (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html).
Следовательно, я делаю вывод, что каждый класс может обращаться к java.lang.Object методам, даже если они protected.
Взгляните на следующий пример:
public class Testclass {
public Object getOne() throws CloneNotSupportedException {
return this.clone();
}
public Object getTwo() throws CloneNotSupportedException {
return ((Object) this).clone();
}
}
Пока getOne() компилируется отлично, getTwo() дает
Testclass.java:6: clone() has protected access in java.lang.Object
return ((Object) this).clone();
Я не понимаю, почему getTwo() не компилирует и не имеет разницы (относительно доступа членов java.lang.Object) с getOne().