Java 要求类的实例重写方法

Java 要求类的实例重写方法,java,Java,情况是这样的:我有一个类,我创建了的实例。我希望它继承类中的大多数方法/变量,但我希望需要重写一些方法,类似于抽象类的工作方式 这是到目前为止我的代码 public class Example { public void methodOne() { //Inherited } public void methodTwo() { //Interited //Maybe calls methodThree() as a part

情况是这样的:我有一个类,我创建了的实例。我希望它继承类中的大多数方法/变量,但我希望需要重写一些方法,类似于抽象类的工作方式

这是到目前为止我的代码

public class Example {
    public void methodOne() {
        //Inherited
    }
    public void methodTwo() {
        //Interited
        //Maybe calls methodThree() as a part of its function
    }
    public void methodThree() {
        //Override Me
    }
}
我不能[使类抽象],因为我需要创建实例

将类抽象化确实会阻止实例化,但由于您希望在重写方法之前阻止实例化,因此这是正确的做法

您可以匿名进行重写,因此在语法上这类似于实例化基类:

public abstract class Example {
    public void methodOne() {
        //Inherited
    }
    public void methodTwo() {
        //Interited
        //Maybe calls methodThree() as a part of its function
    }
    public abstract void methodThree();
}
...
static void main(String[] args) {
    Example e = new Example() {
        @Override
        public void methodThree() {
            ... // Do something
        }
    };
}
首先,要求人们以特定的方式编写代码可能会适得其反。有些人可能有一个合法的用例(你没有考虑过!!)以不同的方式使用它,你的限制可能会迫使他们以一种比没有你的限制更糟糕的方式来解决问题。记住这一点

但这里有一个解决方案:

public abstract class ExampleBase  {
    public void methodOne() {
        // Inherited
    }

    public void methodTwo() {
        // Interited
        // Maybe calls methodThree() as a part of its function
    }

    public abstract void methodThree();
}

public final class Example  {
    @Override
    public void methodThree() {
        // Do stuff.
    }
}

我们通过将所有要继承的成员移动到一个抽象超类来解决这个问题。您想要强制人们重写的任何方法都被声明为
abstract
。通过将具体的
示例
类声明为
最终
,我们防止他们绕过您的需求,在不重写
methodThree
的情况下对
Example
进行子类化,因此将其抽象化。我认为您不能将其抽象化,因为您创建了该类的实例?@SLaks,如问题中所述,我不能,因为我需要创建instanceso您可以创建抽象类的实例变量,只要它覆盖所有抽象方法/变量,对吗?@AllenF。这就是问题所在--它不再是您正在实例化的抽象类。此语法生成从
示例
派生的匿名类,但由于它重写了抽象方法,匿名类不再是抽象的。