Java 如何限制子类重写/实现超类方法

Java 如何限制子类重写/实现超类方法,java,inheritance,Java,Inheritance,我有一个抽象类,抽象方法method1和method2。我有扩展抽象类的类A、B和C 我的问题是如何限制类B只覆盖方法2?我希望所有其他类都能够随意重写任何方法 如果使用抽象类无法实现这一点,那么是否可以使用接口实现这种情况?如果是的话,你能举个例子给我解释一下吗 这里有一个我想要实现的案例。抽象类bird具有抽象方法fly()。我希望eagle能够覆盖它,但不是penguin类 abstract class bird{ abstract void fly();

我有一个抽象类,抽象方法method1和method2。我有扩展抽象类的类A、B和C

我的问题是如何限制类B只覆盖方法2?我希望所有其他类都能够随意重写任何方法

如果使用抽象类无法实现这一点,那么是否可以使用接口实现这种情况?如果是的话,你能举个例子给我解释一下吗

这里有一个我想要实现的案例。抽象类bird具有抽象方法fly()。我希望eagle能够覆盖它,但不是penguin类

    abstract class bird{
            abstract void fly();
    }
    class eagle extends bird{
            @override
            void fly(){
                    Sysout("I can fly really high!");
    }

    class penguin extends bird{
            @override
            /*How do I make sure this method is not at overridden, because there are chances that      this method could be accidentally overridden*/
            void fly(){
                    Sysout("I cannot fly");
            }
    }

您可以在<>代码> b/COD>中创建一个类,并覆盖<代码> >方法2>代码>的超级类,并将其标记为<代码>最终< /代码>。然后,
B
将从这个中产阶级扩展而来,无法覆盖
method2

注意,在这种情况下,最好通过使用接口而不是扩展方法来添加行为。例如:

public interface CanFly {
    void fly();
}

public class Eagle implements CanFly {
    @Override
    public void fly() {
        //...
    }
}

public class Penguin {
    //I cannot fly, I do not need to implement CanFly
}

您可以在<>代码> b/COD>中创建一个类,并覆盖<代码> >方法2>代码>的超级类,并将其标记为<代码>最终< /代码>。然后,
B
将从这个中产阶级扩展而来,无法覆盖
method2

注意,在这种情况下,最好通过使用接口而不是扩展方法来添加行为。例如:

public interface CanFly {
    void fly();
}

public class Eagle implements CanFly {
    @Override
    public void fly() {
        //...
    }
}

public class Penguin {
    //I cannot fly, I do not need to implement CanFly
}

你不能…你可以允许每个子类,也可以不允许任何子类。
只需为您不希望由B实现的方法创建一个接口,并使A和C实现该接口,而B只是扩展Abstract类。

您不能..您可以允许每个子类,也可以不允许任何子类。

只需为不希望由B实现的方法创建一个接口,并使A和C实现该接口,而B只是扩展abstract类。

您确定可以在抽象方法中使用System.out.println吗。哈哈……我不认为Fly()应该是bird的一员,如果很明显有些鸟不会飞的话;)这就是让我对科幻小说反感的地方。自由意志凌驾于垃圾之上@OP:你确定你的鸟课是正确的吗?那鹰呢?请阅读Java语言基础知识。花几个小时阅读会为你以后省去很多麻烦。快速编辑并不能解决你的问题。您确定抽象方法可以有一个主体吗?应该应用策略设计模式来满足您的要求。您确定可以在抽象方法中使用System.out.println。哈哈……我不认为Fly()应该是bird的一员,如果很明显有些鸟不会飞的话;)这就是让我对科幻小说反感的地方。自由意志凌驾于垃圾之上@OP:你确定你的鸟课是正确的吗?那鹰呢?请阅读Java语言基础知识。花几个小时阅读会为你以后省去很多麻烦。快速编辑并不能解决你的问题。你确定一个抽象方法可以有一个主体吗?应该应用策略设计模式来满足你的要求。如果类a和C想要覆盖方法2,它们是否需要从抽象类扩展,而方法2不是最终的?OPs的问题不是这个。他只是问“如何防止子类中的重写”,你解释了基于接口的行为注入。@LuiggiMendoza回答得很好。我想知道为这个特殊问题使用接口的原因。为什么这种方法优于课堂上的最后一种方法。@Nazgul阅读了我答案的第一句话,其中涵盖了OP的问题。在那之后,我提出了另一种设计方案。@max777,因为不是所有的鸟都会飞,它们也一定不会。属于扩展bird的每个类。当您想要类的特定行为时,通常使用接口并实现它们。但是,如果您的设计开始变得糟糕,您就停止使用接口实现,转而使用组合和策略设计模式。因此,如果类A和C想要覆盖method2,它们是否需要从method2不是最终的抽象类进行扩展?OPs的问题不是关于这一点。他只是问“如何防止子类中的重写”,你解释了基于接口的行为注入。@LuiggiMendoza回答得很好。我想知道为这个特殊问题使用接口的原因。为什么这种方法优于课堂上的最后一种方法。@Nazgul阅读了我答案的第一句话,其中涵盖了OP的问题。在那之后,我提出了另一种设计方案。@max777,因为不是所有的鸟都会飞,它们也一定不会。属于扩展bird的每个类。当您想要类的特定行为时,通常使用接口并实现它们。但若您的设计开始变得糟糕,那个么您就停止使用接口实现,转而使用组合和使用策略设计模式。