我正在寻找如何使用自定义内容扩展父类(super class)的方法的解决方案。
例如我有一个 super 类
class A{
public A(){
boolean ok = doSomeInitialWork();
if(ok){
specialMehtod();
}
}
specialMehtod(){
System.out.print("HEllO");
}
}
所以我的 A 类做了一些“init”事情,然后调用specialMehtod()。现在我想让class B extends A
并向specialMehtod()添加一些其他代码。像这样的东西:
Class B extends A{
B(){
super();
}
specialMehtod(){
System.out.print("BBBBB");
}
}
但是如果我这样做,我会调用a.SpecialMethod()
expizit,实际上我只想“添加”System.out.print("BBBBB");
code> 到specialMethod(),这样它仍然可以从A的构造函数中调用。
我想要实现的是,我最终可以在我的主课上做到
new B();
ant 的输出将是。
你好
BBBB
因为 B() 调用 A() 的构造函数,而 A() 又调用由 B.specialMethod() 扩展的 A.specialMethod()
;
可能吗?
谢谢
最佳答案
你必须这样做:
public abstract class A{
public abstract void anotherMethod();
public A(){
// some stuff..
specialMethod();
}
private final void specialMethod(){
System.out.println("specialMethod");
anotherMethod();
}
}
public class B extends A{
public B(){
super();
}
public void anotherMethod(){
System.out.println("anotherMethod");
}
}
通过这种方式,您可以强制扩展类实现 anotherMethod()
方法,并且从抽象类 A
调用此方法。如果您的扩展类不需要在 anotherMethod()
中执行任何操作,则可以将方法体留空。
正如问题评论中提到的,您必须继承或重写该方法。重写方法时,您必须显式调用 super 方法 super.someMethod();
,或者在继承时,您无法向给定方法添加其他功能。
因此,以您的示例为例,如果您不在 B
中实现 specialMethod()
,它将打印出“HELLO”,因为 A
有该方法的实现,但 B
没有。如果您像 B
类示例中那样重写该方法:
specialMethod(){
System.out.println("BBBBB");
}
这将导致“HELLO”不会被打印出来。在这种情况下,A
的构造函数将直接调用 B.specialMethod()
(在 B 对象的实例上)。如果您不想调用 A.specialMethod()
,则必须显式调用它。因此,不,您不能在不显式调用 super.specialMethod()
的情况下向父类(super class)中实现的方法“添加功能”。
出于这个原因,我构建了上面的示例作为解决方法。请注意,我已经更新了代码。在该示例中,如果您调用 new B();
,输出将为:
specialMethod
anotherMethod
通过此解决方法,扩展类不必显式调用 super.specialMethod()
,但它必须实现 anotherMethod()
。此外,通过将 specialMethod
设为 final
方法,B
不允许重写 specialMethod
。
关于java - 如何使用自定义内容扩展父类(super class)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31024858/