为什么java中的Object类中有公共方法?

时间:2010-08-15 15:24:17

标签: java public-method

当我们知道java中的所有类都默认扩展了Object类,那么为什么有public modifier的方法哪里有受保护就足以从任何类访问这些方法?所以需要一些信息。 感谢。

4 个答案:

答案 0 :(得分:11)

如果Object方法不是public(或包范围),则无法从子对象外部调用它们。它们由所有Java对象继承的事实与这些方法的范围正交。

简单示例:您多久拨打一次x.toString()?如果该方法不公开,则无法做到这一点。如果该方法根本不存在于Object中,则必须为每个新类重新实现它。

答案 1 :(得分:1)

clone()是Object上的受保护方法,您无法在其他类的实例上调用clone()

答案 2 :(得分:1)

<编辑> 尽管一个对象可以访问同一个类的所有对象的私有属性,但即使受保护的方法是在公共超类中定义的,也无法从其他类访问对象的受保护方法。

因此,虽然此代码编译:

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.

clone() and finalize() 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.

clone()。从我的角度来看,这些方法根本不应该在Object中,而应该在一个专门的Lock类中。但我想有充分的理由在很早的时候把它们放在那里,如今不能在不破坏兼容性的情况下改变它们。

答案 3 :(得分:1)

  

受保护就足够了   从任何方式访问这些方法   类

来自任何一个班级,是的,但不是任何Object

Java语言规范defines protected的含义如下:

  

受保护的成员或构造函数   可以从外部访问对象   声明它的包   只有负责的代码   该对象的实现。

也就是说,子类S只能在S的实例上调用超类C的受保护构造函数/成员。