java - 如何使用自定义内容扩展父类(super class)的方法

标签 java

我正在寻找如何使用自定义内容扩展父类(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/

相关文章:

java - 如何设置 x 按钮一次清除文本,第二次关闭 SearchView Android?

java - 如何将数据写入套接字 channel

java - 如何在java中安排每日任务?

java - Android Studio 2 中的 PeerConnectionFactory 没有方法

java - 两个不同服务器生成的报告之间的差异

Java流——查找唯一元素

java - 在 servlet 中模拟/生成 SocketTimeoutException

java - 从命令行.dll文件设置java中的类路径

java - 主题 : No bean named 'com.colors.themes.service.ColorLocalService' is defined 中的 Liferay 访问数据库表

java - 根据邻居的值更新多线程单元。如何继续使用 CyclicBarrier?