2015-06-24 38 views
0

我正在寻找解决方案如何使用自定义内容扩展超类的方法。如何使用自定义内容扩展超类的方法

,比如我有一个超类

class A{ 

    public A(){ 
    boolean ok = doSomeInitialWork(); 

    if(ok){ 
     specialMehtod(); 
    } 
    } 

    specialMehtod(){ 
    System.out.print("HEllO"); 
    } 
} 

所以我的A类做了一些 “初始化” 的东西,然后调用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的构造方法中调用

我想实现什么,是finaly我可以在我的主类

new B();

蚂蚁输出会做。因为B()调用A()的构造函数,它调用由B.specialMethod()扩展的A.specialMethod();

可能吗?

感谢

+1

不知道我明白你想要做什么,但如果你重写B中的someSpecialTask​​方法,它应该不工作? – LBes

+1

您既可以按原样继承方法,也可以重写它。不幸的是,下面的所有答案都为您提供了解决方案,但不回答您的问题。 – zubergu

+0

我编辑我的问题,也许它现在更清楚我想实现什么 – user1908375

回答

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();,或者在继承时,不能向给定的方法添加其他功能。
因此,以您的示例来说,如果您没有在B中执行specialMethod(),它将打印出“HELLO”,因为A对此方法有实施,但B没有。如果你覆盖的方法就像你在做例子在B类:

specialMethod(){ 
    System.out.println("BBBBB"); 
} 

将有“HELLO”不会被打印出来的效果。在这种情况下,A的构造函数将直接调用B.specialMethod()(在B对象的实例上)。如果你不想A.specialMethod()被调用,你必须明确地调用它。所以,不,你不能在没有明确地调用super.specialMethod()的情况下向超类中实现的方法“添加功能”。

由于这个原因,我已经构建了上述示例作为解决方法。请注意,我已经更新了代码。与例如,如果你调用new B();,输出将是:

specialMethod 
anotherMethod 

而与此解决方案,延伸类没有明确要叫super.specialMethod(),但它必须实现anotherMethod()。此外,通过制作specialMethod a final方法,B不允许覆盖specialMethod

+0

谢谢你解释。我试了一下,它完美地工作。顺便说一句,我使用Eclipse,它自动建议我添加anotherMethod()到B类,并把它与@Override注释。这个注释只是为了更好地查看重写的方法吗? – user1908375

+0

是的,我不确定@Override注释的所有好处是什么,但它肯定比较容易阅读。创建JavaDoc可能会带来好处,并且如果您使用[java.lang.reflect](https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/package-summary的.html)。 – MalaKa

0

使用abstract方法A。这样的 -

public class A{ 
    public abstract specialMethod(); 
} 

然后当B延伸AB必须实现specialMethod()由它自己。

相关问题