当前位置: 首页 > 面试题库 >

为什么我们不能用私有扩展类方法覆盖基类方法?

邹阳
2023-03-14
问题内容
class One {
    void foo() { }
}
class Two extends One {
    private void foo() { /* more code here */ }
}

为什么上面的代码片段是错误的?


问题答案:

我将尝试结合其他答案中的想法来提出一个答案。

首先,让我们看一下代码中正在发生的事情。

看一下代码

One类有一个包私有foo方法:

class One {
    // The lack of an access modifier means the method is package-private.
    void foo() { }
}

Two该子类的类One的类,并且所述foo方法是被覆盖的,但具有访问修饰符private

class Two extends One {
    // The "private" modifier is added in this class.
    private void foo() { /* more code here */ }
}

问题

Java语言不允许子类降低子类中方法,字段或类Two的可见性,因此,降低该foo方法可见性的类是不合法的。

为什么降低可见度是一个问题?

考虑我们要使用One该类的情况:

class AnotherClass {
  public void someMethod() {
     One obj = new One();
     obj.foo();  // This is perfectly valid.
  }
}

在这里,fooOne实例上调用方法是有效的。(假设AnotherClass该类与该类位于同一包中One。)

现在,如果我们要实例化Two对象并将其放置在obj类型的变量中One怎么办?

class AnotherClass {
  public void someMethod() {
     One obj = new Two();
     obj.foo();  // Wait a second, here...
  }
}

Two.foo方法是私有的,但是,该One.foo方法将允许访问该方法。我们这里有问题。

因此,在考虑继承时允许降低可见性没有多大意义。

链接

  • 控制对类成员的访问-Java教程中的访问修饰符的说明。


 类似资料:
  • 问题内容: 我很困惑为什么不允许以下内容: 我知道为什么接口中的方法不能是静态的,但是为什么覆盖方法不能是静态的? 我希望所有类都可以实现该方法,但目前仅限于如果已经实例化了该对象而无法调用该方法,则只能调用该方法… **_更新: _ 感谢您的回答,我现在对此有了更好的了解。基本上,我不应该尝试使实用程序类(或与此相关的工厂类)实现接口(或者至少不是这样)。 问题答案: 在Java中调用静态方法要

  • 我试图理解为什么我们不能覆盖静态和最终方法。我不明白背后的目的。

  • 问题内容: 为什么Java不允许将顶级类声明为私有?除了“我们无法访问私人课程”之外,还有其他原因吗? 问题答案: 顶级类作为私有类是完全没有用的,因为没有人可以访问它。

  • 问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha

  • Lambda表达式必须转换为函数接口。据我所知,他们不能扩展一个类,但我想知道是否有办法得到类似的东西。 我有

  • 问题内容: 我想知道为什么在Java语言中a 不能扩展。 我不是在谈论一个延伸的(这不能做,因为Java没有多重继承,而Š隐含延长),但一类的以只添加额外的方法,而不是额外的枚举值。 就像是: 要这样使用: 因此,有人可以对此限制提供理由(或将我指向正确的JLS部分)吗? 问题答案: 我认为 他们这样做 的答案来自以下问题: 在您的示例中,如何实例化MyClass?用户永远不会(通过)显式实例化枚