【问题标题】:Inheritance in Java instantiating classes polymorphismJava实例化类多态性中的继承
【发布时间】:2014-03-12 22:16:39
【问题描述】:
写作有什么好处:
Bicycle bike = new RoadBike(...);
而不是
RoadBike bike = new RoadBike(...);
当然是假设RoadBike extends Bicycle。
我问是因为即使我写了
RoadBike bike = new RoadBike(...);
Bicycle中的所有方法,因为有扩展,我仍然可以使用,那换个方式写有什么意义呢?
谢谢!
【问题讨论】:
标签:
java
inheritance
polymorphism
【解决方案1】:
如果 Bicycle 是一个接口,它将允许您绕过该接口并使您的方法更“通用”或“多态”。
如果您有另一个类StreetBike(并且它实现了自行车接口),您可以使用该类和RoadBike 来表示调用方法“ride”,并且每个类将根据实现而不同地骑行。
Public Interface Bicycle {
public ride();
}
public StreetBike implements Bicycle{
public ride(){
System.out.println("I am riding on the street");
}
}
public RoadBike implements Bicycle{
public ride(){
System.out.println("I am riding on the road");
}
}
更进一步,我们可以使用这个简单的例子,但我认为它明白了
//PERSON POJO
public Person {
//properties
public rideBike(Bicycle bike){
bike.ride(); //could be StreetBike or RoadBike, depends on what you pass in. That's the power of it.
}
}
【解决方案2】:
表达多态性最清晰的方法是通过抽象基类(或接口)
public abstract class Bicycle
{
...
public abstract void ride();
}
这个类是抽象的,因为没有为 Bicycle 定义ride() 方法。它将为子类 RoadBike 和 MountainBike 定义。此外,自行车是一个抽象的概念。必须是其中之一。
所以我们使用抽象类来推迟实现。
public class RoadBike extends Bicycle
{
...
@Override
public void ride()
{
System.out.println("RoadBike");
}
}
和
public class MountainBike extends Bicycle
{
...
@Override
public void ride()
{
System.out.println("MountainBike");
}
}
现在我们可以通过在运行时调用 Bicycle 基类 Bicycle 来区分,但由于运行时绑定,将调用相应的子类方法。
public static void main(String args)
{
ArrayList<Bicycle> group = new ArrayList<Bicycle>();
group.add(new RoadBike());
group.add(new MountainBike());
// ... add more...
// tell the class to take a pee break
for (Bicycle bicycle : group) bicycle.ride();
}
运行它会产生:
RoadBike
MountainBike
...
希望这能让你明白其中的区别!
【解决方案3】:
优点是Bicycle 引用更通用,可以引用在其继承层次结构中具有Bicycle 的任何对象,例如MountainBike。它提供了更大的灵活性,并且不会将您束缚于具体的实施。这是 OOP 的基本原则之一。也就是说,在某些情况下,例如在使用 Bicycle 或 RoadBike 时以短方法使用时没有区别。还有一个方面是调用重载方法,这在编译时由引用类型确定(取决于引用类型,即使它们指向同一个对象,也可能调用不同的方法),但不建议使用这些类型的重载方法。
你可能会得到更好的解释here。