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

Java,隐式调用重写方法

竺绍辉
2023-03-14
问题内容

现在在一些Java代码中我有这样的东西

class A {
 void f() {

 }
 A() {
  f();
 }
}

class B extends A{
 @Override
 void f() {
  //do some stuff
  super.f();
 }
}

class C extends B {
 @Override
 void f() {
  //do some stuff
  super.f();
 }
}

我想f()调用每个父类,然后向上迭代,运行重写的f()。我通过super.f()显式调用来完成此操作,尽管我不想这样做。

我这样做的原因是必须在到达A中的构造函数之后进行后期处理。每个类中都有一个状态,可以适当地初始化它,这就是为什么我们有向上f()的s的原因。

因此,的构造函数A实际上是

A() {
  //init some state in a
  f(); //run f(), which will depend on the previous operation
}

如果我做一些new C();我想C.f()打电话的事情,然后B.f()打电话,然后A.f()打电话

无论如何,如果有更聪明的方法可以做到这一点,我会接受的。


问题答案:

在构造函数中调用非最终方法通常是个坏主意-至少,我建议您 大量 编写文档。请记住,当调用f()时,将不会调用C的构造函数-
也不会调用任何变量初始化器。该对象仅被半初始化,因此需要非常仔细地编写方法。

super.f()在普通的Java中,没有任何隐式调用的方法。鉴于我会在该代码中发出很大的警告,所以只有一条语句离世界还很远:)

如果您想验证它是否被调用,则始终可以A.f()在调用之后立即检查A的构造函数中的结果-这将检查该调用是否已到达顶层。



 类似资料:
  • 在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为 方法重写(override),又称为 方法覆盖。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。 子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。 在重写方法时,需要遵循

  • 问题内容: 想要有关对象的某些调试信息时,我曾经使用toString的隐式调用,因为在对象为null的情况下,它不会引发Exception。 例如: 代替: 除了null以外,还有什么区别吗? 如果前者不起作用,后者可以工作吗? 编辑: 在隐式调用的情况下,到底做了什么? 问题答案: 没有什么区别。使用较短且经常使用的那一种。 如果您实际上由于其他原因想要获取对象的字符串值,并且希望它为null友

  • 我有格式的http查询参数列表和(javax/ws/rs/client/webtarget.java)。然后,我使用命令式方法将这些查询参数逐一附加到。

  • 我正在尝试覆盖子类中从父类继承抽象方法的方法。我正在尝试更改泛型返回类型,但我有点困惑。 基本泛型类: 儿童班: 实施: 我想在其中覆盖参数化方法的子视图类: 这是Eclipse抛出错误消息的地方: 注意类和接口:事件和级别: 以及继承自 的 Model 类 我试图实现的是编写更抽象的代码,因为这些类、接口将被多个类扩展(在我的例子中是不同的视图类型)。这些是抽象类:< code>BaseAdap

  • 问题内容: 用Java如何实现方法重写?在C ++中,我们有vtable的概念。.这是如何在Java内部实现的? 问题答案: 为了回答这个问题,特别是在虚拟机中如何实现覆盖,在Java虚拟机编程(Google图书链接)中有一篇文章。 VM将在所引用的类中寻找适当的方法定义,然后逐步处理继承栈。显然,在某些阶段将应用各种优化。 有关相关字节码指令的说明,请参见此处: invokevirtual会查看

  • 问题内容: 如何覆盖对象类中的equals方法? 即我有 我想将参数obj转换为Person类型,但是如果执行(Person)obj,它将无法正常工作。 问题答案: 您可以将其强制转换为方法,只需使用的实例确保其类型正确