Java 继承,需要超级调用

Java 继承,需要超级调用,java,inheritance,Java,Inheritance,所以我对一些事情很好奇,这不一定是我需要知道的,但仍然是一种好奇心。 如何告诉继承的方法它需要调用其父方法? 例如,安卓系统: @Override public void onResume(){ } 方法抛出错误,直到您放置super.onResume()在它里面 我知道如果父级有一个必需的构造函数,那么构造函数需要一个超级调用,但是方法调用 如何告诉类它可以有可继承的方法,但这些继承的方法需要调用其父类?Java无法要求重写的方法调用其超类实现。您也无法阻止它被多次调用(与构造函数相反)。

所以我对一些事情很好奇,这不一定是我需要知道的,但仍然是一种好奇心。 如何告诉继承的方法它需要调用其父方法? 例如,安卓系统:

@Override
public void onResume(){

}
方法抛出错误,直到您放置
super.onResume()在它里面

我知道如果父级有一个必需的构造函数,那么构造函数需要一个超级调用,但是方法调用


如何告诉类它可以有可继承的方法,但这些继承的方法需要调用其父类?

Java无法要求重写的方法调用其超类实现。您也无法阻止它被多次调用(与构造函数相反)。

Java无法要求重写的方法来调用其超类实现。你也不能阻止它被多次调用(同样与构造函数相反)

如何告诉继承的方法它需要调用其父方法 方法

Java编译器没有办法强制执行这一点,在一般情况下,您可能不希望使用此功能

  • 当一个子类重写一个超类方法时,如果必要的话,它可以完全用一个更适合它自己抽象的方法替换该方法。在这种情况下,子类方法永远不希望调用超类方法

  • 许多子类方法补充了超类中现有的实现。在这种情况下,调用超类方法是自然和适当的

底线是开发人员可以根据其实现的需要自由地调用或不调用。如果有一种方法可以通过某种方法声明来强制解决问题,这会导致编译器坚持所有子类都要调用超类方法,这会好吗?也许

这些细节通常是实现细节,并且是合同的一部分,在构思超类时,应该始终指定这些细节。这样的契约(例如Object.equals()契约)是语言外规范,编译器没有足够的能力来执行。这些契约可以而且应该始终在超类文档中指定,以便所有实现者都知道道路规则

如何告诉继承的方法它需要调用其父方法 方法

Java编译器没有办法强制执行这一点,在一般情况下,您可能不希望使用此功能

  • 当一个子类重写一个超类方法时,如果必要的话,它可以完全用一个更适合它自己抽象的方法替换该方法。在这种情况下,子类方法永远不希望调用超类方法

  • 许多子类方法补充了超类中现有的实现。在这种情况下,调用超类方法是自然和适当的

底线是开发人员可以根据其实现的需要自由地调用或不调用。如果有一种方法可以通过某种方法声明来强制解决问题,这会导致编译器坚持所有子类都要调用超类方法,这会好吗?也许


这些细节通常是实现细节,并且是合同的一部分,在构思超类时,应该始终指定这些细节。这样的契约(例如Object.equals()契约)是语言外规范,编译器没有足够的能力来执行。这些契约可以而且应该始终在超类文档中指定,以便所有实现者都知道道路规则。

在Javadoc中。你告诉你的用户;不是你的类。java中没有强制调用方法的超类实现的东西。这种行为是在需要这种行为的Android类中实现的。(基本上,他们取消设置一个布尔值,调用重写的方法,然后检查布尔值。如果调用super,布尔值会再次设置。)Elliot,那么Javadoc与java是分开的吗?但是在Javadoc中强制执行某些规则。你告诉你的用户;不是你的类。java中没有强制调用方法的超类实现的东西。这种行为是在需要这种行为的Android类中实现的。(基本上,他们取消设置一个布尔值,调用重写的方法,然后检查布尔值。如果调用super,布尔值会再次设置。)Elliot,那么Javadoc与java是分开的吗?但是强制执行某些规则吗?在一些情况下,强制调用子类会派上用场。我当时正在构建一个游戏引擎,这本可以派上用场的。但问题是,在使用Android时,如果我没有包含super调用,例如super.onResume(),编译器会发出错误。当然,我在安卓工作室工作,所以可能会有一些额外的功能来强制你坚持他们的设计?所以调查显示,安卓工作室会在这个方法下面画上红色的下划线,说它应该调用它的父方法,但它不会拒绝你在没有调用的情况下执行它。总之,这是一个有趣的实验。谢谢大家调用超类方法的需求是超类的一个实现细节。此类要求针对特定类别,应予以定义和记录;并非所有的超类都有此要求,因此编译器无法强制执行此要求。例如,JavaFX
Cell
类包含受保护的回调方法
itemUpdate()
。作为第一步,开发人员必须调用
super.updateItem()
,文档中写着“在这里调用super非常重要-不要跳过这一步!”。如果你不这样做,编译器不会抱怨的。有一些情况下