以下程序失败:
abstract class A {
protected void method() {}
}
class B extends A {
private void method() {}
}
public class main{
public static void main(String []args) {}
}
与:
main.java:6: error: method() in B cannot override method() in A
private void method() {}
^
attempting to assign weaker access privileges; was protected
1 error
将派生方法设置为受保护/私有作品。
问:Java不允许你进一步限制子类访问的原因是什么?我将其与具有完全相反规则的C进行对比。
所有Java方法都是虚拟的。所以假设你得到一个实际上是B
的实例的A
。你不知道这一点。你调用A. method()
,但是因为method
是虚拟的,它尝试调用B. method()
。但是B. method
是私有的,所以现在怎么办?
编辑:正如Luiggi Mendoza在他的回答中指出的那样,显然Java方法在默认情况下只是虚拟的。
进一步编辑:我想我描述的场景是一个。方法是公共的,您将其作为受保护的方法。但你明白了。
在Java中,所有方法默认都是虚拟
(私有
和静态
方法除外)。因此,在Java中重写方法时,它必须遵循对象引用类中的定义。通过Java中的这条规则,您不能缩小被重写方法的可见性,只需保持相同的可见性或扩大它。
Java,当我重写一个方法时,编译器会将任何缩小可见性的尝试标记为错误。例如:我不能将公共方法重写为受保护的,而我可以将受保护的方法重写为公共的。 我有兴趣了解这条规则背后的设计决策/思维。
当我们不知道任何给定对象的finalize()方法何时可以运行时,我们需要在java中重写finalize()方法的哪里?我们可以在finalize()中关闭什么类型的资源?GC调用finalize()方法的最佳机会是什么?
问题内容: 当您在子类中重写某个方法时降低了其可见性时,为什么编译器会给出错误消息? 问题答案: 因为子类的每个实例仍然需要是基类的有效实例(请参见Liskov替换原理)。 如果子类突然失去了基类的一个属性(例如,一个公共方法),那么它将不再是基类的有效替代品。
我找不到任何解释原因的好消息:
本文向大家介绍hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?相关面试题,主要包含被问及hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?时的应答技巧和注意事项,需要的朋友参考一下 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ha
我不明白这一点: 没有这个,我可以做到: 为什么在第一种情况下我不能调用hello()方法,而在第二种情况下我可以调用?