Java 只有直接子类必须实现方法

Java 只有直接子类必须实现方法,java,inheritance,Java,Inheritance,假设我正在编写一个zoo模拟器(处理继承时我最喜欢的例子)。我有一门普通的动物课。然后我有两个类扩展了Animal,称为Bird,另一个类称为LandAnimal。Bird的所有子类都将以相同的方式移动(我不打算在我的动物园里养鸵鸟!),同样地,LandAnimal。因此,我在Animal类中创建了一个move()方法。但是鸟类和陆地动物的移动方式如此不同,我不想在这个方法中添加任何东西。所以我把它标记为abstract,忽略了Bird的所有子类都必须实现它这一事实。这对我来说并不好,即使代码只

假设我正在编写一个zoo模拟器(处理继承时我最喜欢的例子)。我有一门普通的动物课。然后我有两个类
扩展了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
实现了abstract
move
方法,
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()
存在于
动物
类中,即使它没有在那里实现。当您填写列表时,您可以使用