我一直在阅读java中的继承,我有一个相当简单的问题,我在手册页上找不到。
以this为例。
我想先定义一个类:
Bycicle bike = new Bicycle();
后来我想说它是一辆山地自行车,所以它属于某个子类,并为山地自行车设置了一个属性(比如numberOfGears)。
这可能按此顺序吗?或者我是否需要立即说它是山地自行车?
答案 0 :(得分:5)
如果您知道只使用Bycicle
的方法,那么将变量声明并初始化为Bycicle
:
Bycicle bike = new Bicycle();
如果要更改类实现但仍然只使用Bycicle
方法,则将变量声明为Bycicle
并将其初始化为特定的类实现,在本例中为MountainBike
:
Bycicle bike = new MountainBike();
如果您知道将使用类实现的特定方法,那么您有两个选择:
初始化为类实现,在需要从此类实现调用方法的特定部分中,使用向下转换:
((MountainBike)bike).mountainBikeMethod();
我不推荐这种方法,因为如果你改变了初始化类的方法,那么在更改这些向下转换时你应该小心,否则你会得到RuntimeException
,特别是ClassCastException
用于向下转换为错误的课程。
声明并初始化为类实现,然后忘记使用超类类型,因为那不是你需要的:
MountainBike bike = new MountainBike();
答案 1 :(得分:0)
如果你想说这是一辆山地自行车,你需要创建一个MountainBike实例,而不仅仅是自行车。然后你可以垂头丧气。但这看起来有点不自然,所以要么首先将自行车称为MountainBicycle,要么使用适配器设计模式将其改装为山地自行车。
答案 2 :(得分:0)
类中的实例化对象以后不能更改为其他类。
无论如何,MounteinBike仍然是一辆自行车。然后你可以这样做:
Bycicle bike = new MountainBike();
或
MountainBike mountainBike = new MountainBike();
当可能被优先使用更高级别的抽象时,在这种情况下是第一个例子。