Хотя один объект может обращаться к закрытым свойствам всех объектов одного и того же класса, вы не можете получить доступ к защищенным методам объекта из другого класса, даже если защищенный метод определен в общем суперклассе.
Итак, пока этот код компилируется:
public class Test {
private int x;
private void change(Test test) {
test.x = test.x + 1;
}
public static void main() {
Test test1 = new Test();
Test test2 = new Test();
test1.change(test2);
}
}
Следующий код не скомпилируется:
public class Test2 {
public static void main() {
Test1 test1 = new Test1();
test1.clone(); // The method clone() from the type Object is not visible
}
}
Возможность звонить toString()
, equals(Object)
, hashCode()
и getClass() on all objects makes things a lot easier.</p>
<p><code>clone()
и finalize()
защищены. Таким образом, чтобы иметь возможность вызывать их извне, подкласс должен увеличить видимость. И это, очевидно, проектное решение.
Если честно, я понятия не имею, почему Sun решила, что все объекты являются "замками" и имеют notify()
, notifyAll()
, wait(long)
, wait (long, int) . С моей точки зрения, этот метод вообще не должен быть в Object, а в специализированном Lock-классе. Но я думаю, что была хорошая причина иметь их там в самые первые дни, и это нельзя изменить в наше время без нарушения совместимости.