当前位置: 首页 > 知识库问答 >
问题:

与C相反,为什么在重写时不能缩小方法可见性?[副本]

云宏儒
2023-03-14

以下程序失败:

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进行对比。

共有2个答案

屈晨
2023-03-14

所有Java方法都是虚拟的。所以假设你得到一个实际上是B的实例的A。你不知道这一点。你调用A. method(),但是因为method是虚拟的,它尝试调用B. method()。但是B. method是私有的,所以现在怎么办?

编辑:正如Luiggi Mendoza在他的回答中指出的那样,显然Java方法在默认情况下只是虚拟的。

进一步编辑:我想我描述的场景是一个。方法是公共的,您将其作为受保护的方法。但你明白了。

蔡明贤
2023-03-14

在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()方法,而在第二种情况下我可以调用?