当我们知道java中的所有类都默认扩展了Object类,那么为什么有public modifier的方法哪里有受保护就足以从任何类访问这些方法?所以需要一些信息。 感谢。
答案 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的受保护构造函数/成员。