Java方法无法调用但可以被覆盖

时间:2017-08-22 14:45:57

标签: java inheritance abstract-class visibility

如果我不想让我的班级上的某个方法被调用,我只是将其设为私有。

但是如果我想允许覆盖该方法,我必须使其受保护

是否可以在抽象类上设置一个无法调用但可以覆盖的方法? (我猜不是,但有没有解决办法?)

用例:

abstract class Super {

  protected void finalize() {

  }

  public final void doThings() {
   // do stuff
   finalize();
  }
}

以及想要扩展课程的人:

class Sub extends Super {

  @Override
  protected void finalize() {
    closeSockets();
    alertSomeone();
  }

}

但我不希望其他课程调用mySub.finalize();

1 个答案:

答案 0 :(得分:2)

子类可以为超类提供包含要执行的代码的Runnable,而不是覆盖方法。你可以这样做:

public class Super {

    private final Runnable subClassCode;

    public Super(Runnable finalizeCode) {
        subClassCode = finalizeCode;
    }

    public final void doThings() {
        // do stuff
        subClassCode.run();
    }

}

public class Sub extends Super {

    public Sub() {
        super(() -> {
            // code to be executed in doThings()
        });
    }

}

您不需要在构造函数中设置Runnable实例。您也可以访问受保护的setFinalizeCode(Runnable)方法,但该方法也可以由与Super相同的包中的其他类调用。