Java 扩展类不能继承方法吗?

Java 扩展类不能继承方法吗?,java,class,inheritance,overriding,Java,Class,Inheritance,Overriding,我的问题是:我可以创建一个扩展另一个类的类,但选择不继承特定的方法吗 一个简单的例子是,我有一个抽象的Bird类,其中有一个方法fly()。我想为不同种类的鸟类创建类,但企鹅不能飞。如何确保penguin对象不能调用fly()方法?如果需要执行您试图执行的操作,则类/概念的层次结构是错误的。重新设计你的类。你不能。但是,您可以在企鹅的fly()方法中抛出一个UnsupportedOperationException。不行,这将从根本上打破多态性。您必须实现该函数,并执行诸如抛出异常或不执行任何操

我的问题是:我可以创建一个扩展另一个类的类,但选择不继承特定的方法吗


一个简单的例子是,我有一个抽象的Bird类,其中有一个方法fly()。我想为不同种类的鸟类创建类,但企鹅不能飞。如何确保penguin对象不能调用fly()方法?

如果需要执行您试图执行的操作,则类/概念的层次结构是错误的。重新设计你的类。

你不能。但是,您可以在企鹅的
fly()
方法中抛出一个
UnsupportedOperationException

不行,这将从根本上打破多态性。您必须实现该函数,并执行诸如抛出异常或不执行任何操作之类的操作。

重写fly方法,使其指向另一个操作或在不执行该操作的情况下返回。

不,您不能

最接近的方法是重写该方法并抛出

@Override
public void fly() {
    throw new UnsuportedOperationException();
}
JavaAPI有时会这样做,但我个人认为这是糟糕的设计


你可以做的是有一个鸟的层次结构和两个子类FlyableBird和NonFlyableBird,然后让企鹅挂断NonFlyableBird。fly方法将仅在FlyableBird类中。bird类仍然可以包含makeNoise()之类的东西(所有的鸟都会发出噪音,不是吗?),这对于FlybableBird和NonFlyableBird都是通用的

您可以将方法Fly声明为,但是如果不提供实现,您也将被迫将Penguin类声明为抽象类,我认为这不是你想要的,因为企鹅不应该是抽象的,它没有任何意义。

你可以创建一个名为Fly的界面。然后,每个扩展能飞的鸟的具体类都应该实现这个接口。Penguin不会实现这一点,因此您的Penguin对象引用永远不会飞行

您需要有非常好的设计来实现您提到的场景。你需要有如下的设计

public abstract class Bird {
    FlyBehavior flyBehavior;
    public Bird(){
    }

    public void performFly(){
    flyBehavior.fly();      
    }

    public void setFlyBehavior(FlyBehavior fb){
    flyBehavior = fb;
    }
}

public interface FlyBehavior {
    public void fly();
}


public class FlyingBirds implements FlyBehavior {

@Override
public void fly() {
    // TODO Auto-generated method stub
    System.out.println("I can fly");
}
}


public class NonFlyingBirds implements FlyBehavior {

@Override
public void fly() {
    // TODO Auto-generated method stub
    System.out.println("I am not able to fly");
}
}


public class KingFisher extends Bird {
public KingFisher(){
    flyBehavior = new FlyingBirds();
}

public static void main(String[] args) {
    Bird bird = new KingFisher();
    bird.performFly();      
}
}



public class Penguins extends Bird {
public Penguins(){
    flyBehavior = new NonFlyingBirds();
    }

public static void main(String[] args) {
    Bird bird = new Penguins();
    bird.performFly();
}
}

我想,你可以用fly、walk等抽象方法创建一个主要的抽象类Bird。
然后,您可以创建该Bird类的两个子类。FlyingBirds和NonFlyingBirds。在non-FlyingBirds具体类中,您可以将fly方法设为final。因此此方法不会继承到子类

重写penguin类中的fly()并使其抛出“I'm a Brick”异常?我认为您需要有另一个类子集(另一个分类级别),您的设计需要更改。无论你要求什么,都不能马上完成。你应该使用UnsupportedOperationException谢谢你的回复。我曾考虑过进一步细分班级,如果有更简单的方法,那似乎是一件麻烦事。看起来我该学习如何抛出异常了。@MrDetail UnsupportedOperationException是一个运行时异常。查找选中和未选中异常之间的差异。它可能会在很大程度上影响您的代码way@RNJ要通过
unportedoperationexception
我们需要覆盖
nonlyablebirds
上的
fly()
。根据@MrDetail的问题,他希望确保企鹅对象不能调用
fly()
方法。但是设计建议调用fly并抛出
unportedoperationexception
。我认为还需要调用fly for NonFlyableBirds,然后编写一些逻辑来避免飞行行为。@prasadesdeshande为什么在NonFlyableBirds中使用fly()?它不在那里,你不需要任何逻辑来避免飞行行为