 <p>&lt;Edit> Although one object can access private properties of all objects of the same class, you cannot access protected methods of an object from other class even if the protected method is defined in a common super class.</p> <p>So while this code compiles:</p> <pre><code>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); } } </code></pre> <p>The following code will not compile:</p> <pre><code>public class Test2 { public static void main() { Test1 test1 = new Test1(); test1.clone(); // The method clone() from the type Object is not visible } } </code></pre> <p>&lt;/Edit></p> <p>Being able to call <code>toString()</code>, <code>equals(Object)</code>, <code>hashCode()</code> and <code>getClass() on all objects makes things a lot easier.</p> <p><code>clone()</code> and <code>finalize()</code> are protected. So in order to be able to call them from the outside the subclass has to increase the visibility. And that is obviously a design decision.</p> <p>To be honest, i have no idea why Sun decided that all object are "locks" and have <code>notify()</code>, <code>notifyAll()</code>, <code>wait(long)</code>, wait(long, int)</code>. From my point of view those method should not be in Object at all but in a specialized Lock-class. But I guess there was a good reason to have them there in the very early days and it cannot be changed nowadays without breaking compatibility.</p>