现在在一些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,它将无法正常工作。 问题答案: 您可以将其强制转换为方法,只需使用的实例确保其类型正确