如何使用自定义内容扩展超类的方法

时间:2015-06-24 11:04:17

标签: java

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

例如我有一个超类

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();

有可能吗?

由于

2 个答案:

答案 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()