Java 只有直接子类必须实现方法
假设我正在编写一个zoo模拟器(处理继承时我最喜欢的例子)。我有一门普通的动物课。然后我有两个类Java 只有直接子类必须实现方法,java,inheritance,Java,Inheritance,假设我正在编写一个zoo模拟器(处理继承时我最喜欢的例子)。我有一门普通的动物课。然后我有两个类扩展了Animal,称为Bird,另一个类称为LandAnimal。Bird的所有子类都将以相同的方式移动(我不打算在我的动物园里养鸵鸟!),同样地,LandAnimal。因此,我在Animal类中创建了一个move()方法。但是鸟类和陆地动物的移动方式如此不同,我不想在这个方法中添加任何东西。所以我把它标记为abstract,忽略了Bird的所有子类都必须实现它这一事实。这对我来说并不好,即使代码只
扩展了Animal
,称为Bird
,另一个类称为LandAnimal
。Bird
的所有子类都将以相同的方式移动(我不打算在我的动物园里养鸵鸟!),同样地,LandAnimal
。因此,我在Animal
类中创建了一个move()
方法。但是鸟类和陆地动物的移动方式如此不同,我不想在这个方法中添加任何东西。所以我把它标记为abstract
,忽略了Bird
的所有子类都必须实现它这一事实。这对我来说并不好,即使代码只是
@Override
public void move()
{
super.move();
}
在每个文件中都有这样的内容仍然不太合适
主要的问题是:我有没有办法只让直接子类实现一个方法(Bird
必须实现,但是Sparrow扩展Bird
类没有实现)
编辑:我忽略了一些与我的模拟器有关的东西。我不希望有3个不同的列表可以迭代并调用
move()
。我想要一个ArrayList
,我可以用它来更新和绘图。如果你在Bird
中实现move()
方法,并且Sparrow
不需要更改它,那么你就不必在Sparrow
中实现它,它将按原样继承,而无需重新实现它,只调用super.move()代码>。这就是继承的全部思想:在子类中,您重用来自超类的代码,并且仅在行为与父类不同的情况下添加或重写方法。如果您在Bird
中实现move()
方法,并且Sparrow
不必更改它,然后,您不必在Sparrow
中实现它,它将按原样继承,而无需重新实现它,只调用super.move()代码>。这就是继承的全部思想:在子类中,您重用来自超类的代码,并且仅在行为与父类不同的情况下添加或重写方法。如果Bird
实现了该方法,并且Sparrow
扩展了Bird
,则Sparrow
有一个实现;它不需要提供另一个。如果Bird
实现了该方法并且Sparrow
扩展了Bird
,那么Sparrow
有一个实现;它不需要提供另一个。是的——对于抽象方法(和接口方法,它们是一样的),每个类都必须实现所有这些方法,但是实现它们的超类是有效的。因此,如果Bird
实现了abstractmove
方法,Sparrow
不必这样做,因为它的父类已经实现了它。是的——对于abstract
方法(和接口方法,它们是一样的),每个类都必须实现所有这些方法,但是实现它们的超类是有效的。因此,如果Bird
实现了抽象的move
方法,Sparrow
不必这样做,因为它的父类已经实现了它。Yes;只需在Bird
中实现它。如果在Bird
中实现move()
方法,子类可以选择再次重写它,但不必这样做。你说他们这样做是不正确的;只需在Bird
中实现它。如果在Bird
中实现move()
方法,子类可以选择再次重写它,但不必这样做。你的说法是不正确的。@BitNinja没关系,ArrayList
可以包含其任何具体子类的实例(无论层次结构有多深),只要你坚持调用Animal
中存在的方法,您可以将所有动物园添加到同一列表中,并对列表中包含的对象调用方法。这就是多态性在行动中的力量——它与继承一起工作——我可以为(鸟类:动物)
做吗,其中动物
是一个数组列表
,即使动物
中的一些项目可能不是鸟类
?@BitNinja不,但你可以为做(Animal-Animal:animals)
但这就是问题所在。如果我正确理解了你的答案,那么该方法在Animal
类中根本不存在。@BitNinja什么方法?move()
存在于Animal
类中,即使它没有在那里实现。当你填写列表时,你会用实现它的具体子类来实现它,所以它可以被调用。为什么不试试呢?如果你构造一个实际的例子,看看它是如何工作的,那会好得多。@BitNinja没问题,一个ArrayList
可以包含其任何具体子类的实例(无论层次结构有多深),只要您坚持调用动物中存在的方法,您就可以将所有动物园添加到同一列表中,并对列表中包含的对象调用方法。这就是多态性的作用-它与继承一起工作允许我为(鸟鸟:动物)执行操作吗
其中动物
是一个数组列表
,即使动物
中的某些项目可能不是鸟类
?@BitNinja没有,但您可以为(动物:动物)执行
但这就是问题所在。如果我正确理解了您的答案,该方法甚至不会存在于动物类中。@BitNinja什么方法?move()
存在于动物类中,即使它没有在那里实现。当您填写列表时,您可以使用