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.
}
}
在这里,foo
在One
实例上调用方法是有效的。(假设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不允许将顶级类声明为私有?除了“我们无法访问私人课程”之外,还有其他原因吗? 问题答案: 顶级类作为私有类是完全没有用的,因为没有人可以访问它。
问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha
Lambda表达式必须转换为函数接口。据我所知,他们不能扩展一个类,但我想知道是否有办法得到类似的东西。 我有
问题内容: 我想知道为什么在Java语言中a 不能扩展。 我不是在谈论一个延伸的(这不能做,因为Java没有多重继承,而Š隐含延长),但一类的以只添加额外的方法,而不是额外的枚举值。 就像是: 要这样使用: 因此,有人可以对此限制提供理由(或将我指向正确的JLS部分)吗? 问题答案: 我认为 他们这样做 的答案来自以下问题: 在您的示例中,如何实例化MyClass?用户永远不会(通过)显式实例化枚