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

为什么不允许在重写时缩小方法的范围

邰钟展
2023-03-14

Java,当我重写一个方法时,编译器会将任何缩小可见性的尝试标记为错误。例如:我不能将公共方法重写为受保护的,而我可以将受保护的方法重写为公共的。

我有兴趣了解这条规则背后的设计决策/思维。

共有3个答案

宓昂雄
2023-03-14

在过度消除或实现访问级别时,我们应该选择相同的访问级别或更广泛的访问级别。

private < (default) < protected < public

公众是最广泛的层面。

在接口中,所有成员都是默认的公共成员。因此,在实施或过度消除时,我们必须只公开。

万承志
2023-03-14

考虑从a继承的类B<代码>A。m()是公共的。现在考虑以下代码:

A obj = new B();
obj.m();

这个电话应该被允许吗?是的,它应该是,因为obj是类型为A的对象!它也是类型为B的对象,但使用该对象的人不一定知道。

类型为A的每个对象都必须遵守A的契约(接口)<代码>B扩展了A,因此也必须遵守该合同。

段干子晋
2023-03-14

子类应始终满足超类的约定。见Liskov替换原理。

方法的可见性是本合同的一部分。因此,在超类中公开可见的任何内容也应该在子类中公开。

 类似资料:
  • 以下程序失败: 与: 将派生方法设置为受保护/私有作品。 问:Java不允许你进一步限制子类访问的原因是什么?我将其与具有完全相反规则的C进行对比。

  • 问题内容: 在什么情况下HTML页面包含具有重复ID属性的元素是 非法 的? 作为使用HTML已有多年经验的开发人员,我知道这样做的目的是元素ID 应该 是唯一的-我要问的是重复ID的实际负面影响。 当然,某些库中类似于getElementByID()的函数可能返回数组而不是单个元素,并且当开发人员未预期这种情况时,这可能会导致问题。但是,据我所知,此类功能将继续清晰地运行,它们并不是id重复项的

  • 本文向大家介绍为什么在重写 equals方法的同时必须重写 hashcode方法,包括了为什么在重写 equals方法的同时必须重写 hashcode方法的使用技巧和注意事项,需要的朋友参考一下 我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。 其 equals 方法比较的是两个对象的引用指向的地址,hashcode 是一个本地方法,返回的是对象地址值。O

  • 问题内容: 为什么无法覆盖静态方法? 如果可能,请使用示例。 问题答案: 覆盖取决于拥有类的实例。多态性的重点是可以对一个类进行子类化,并且实现那些子类的对象对于在超类中定义的相同方法(在子类中被重写)将具有不同的行为。静态方法未与类的任何实例相关联,因此该概念不适用。 影响Java设计的因素有两个。一个是对性能的关注:Smalltalk批评它太慢(垃圾回收和多态调用是其中的一部分),Java的创

  • 当重写超类的方法时,Java 允许返回类型是协变的。 为什么在覆盖方法时不允许相反的逆变参数类型?

  • 我们举个例子: 一个常见的解决方案是转移到一个抽象类,但是在我的具体案例中,我有一个枚举的接口,所以在这里不适用。我想这不是被忽略了,就是因为接口背后的原始想法,即它们是可用方法的“契约”,但我想我需要关于这是怎么回事的输入。 我读过“为什么Java 8接口方法中不允许使用”final“?”,其中说: 默认方法的基本思想是:它是具有默认实现的接口方法,派生类可以提供更具体的实现 与关联问题一样,由