我正在寻找解决方案如何使用自定义内容扩展超类的方法。
例如我有一个超类
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");
到specialMethod(),这样它仍然可以从A的构造函数中调用。
我想要达到的目标是,我可以在我的主要课程中完成最终目标
new B();
HELLO
BBBBB
因为B()调用A()的构造函数,它调用由{.specialMethod()扩展的A.specialMethod()
;
有可能吗?
由于
答案 0 :(得分:2)
你必须这样:
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.someMethod();
,或者在继承时,不能向给定方法添加其他功能。
因此,如果您未在specialMethod()
中实现B
,那么它将打印出“HELLO”,因为A
具有该方法的实现,但{{1} }} 才不是。如果您像在类B
中的示例中那样覆盖方法:
B
它会产生“HELLO”不会打印出来的效果。在这种情况下,specialMethod(){
System.out.println("BBBBB");
}
的构造函数将直接调用A
(在B对象的实例上)。如果你不想被B.specialMethod()
调用,你必须明确地调用它。所以,不,你不能在没有显式调用A.specialMethod()
的情况下为超类中实现的方法“添加功能”。
出于这个原因,我构建了上面的示例作为解决方法。请注意,我已更新代码。在该示例中,如果您调用super.specialMethod()
,则输出将为:
new B();
通过此解决方法,扩展类不必显式调用specialMethod
anotherMethod
,但必须实现super.specialMethod()
。此外,通过anotherMethod()
specialMethod
方法,final
不允许覆盖B
。
答案 1 :(得分:0)
在abstract
中使用A
方法。像这样 -
public class A{
public abstract specialMethod();
}
然后当B
延伸A
时,B
必须自行实施specialMethod()
。