2014-03-12 42 views
-3

什么是写作的好处:继承Java中实例化类多态性

Bicycle bike = new RoadBike(...); 

,而不是

RoadBike bike = new RoadBike(...); 

假设,当然RoadBike extends Bicycle

我问,因为即使我写

RoadBike bike = new RoadBike(...); 

我仍然可以使用所有Bicycle因为扩展的方法,那么,什么是写它的其他方式的意义呢?

谢谢!

+1

请参阅[Java多教程教程](http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html)。它很好地描述你的例子。 –

回答

1

表达多态性最明显的方式通过一个抽象基类(或接口)是点

public abstract class Bicycle 
{ 
    ... 
    public abstract void ride(); 
} 

这个类是抽象的,因为ride()方法没有为Bicycle定义。它将被定义为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"); 
    } 
} 

现在我们可以通过调用自行车在运行时的基类自行车,但由于运行时绑定相应的子类方法的差异将被调用。

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 
... 

希望这将清除您有什么区别!

0

优点是Bicycle引用是更通用的,可以引用任何在其继承层次结构中具有Bicycle的对象,例如MountainBike。它提供了更多的灵活性,并且不会将您绑定到具体的实施。这是面向对象的基本原理之一。也就是说,有些情况下,如使用简短方法时使用BicycleRoadBike没有区别。另外还有调用重载方法的方面,它由编译时的引用类型决定(取决于引用类型,即使认为它们指向同一对象也可能调用不同的方法),但不建议使用这些类型的重叠方法。

您可能会得到更好的解释here

2

如果Bicycle是一个接口,它将允许您传递接口并使您的方法更“通用”或“多态”。

如果您有另一个课程StreetBike(并且它实现了Bicycle接口),那么您可以使用该类和RoadBike来说出调用方法'搭乘',并且每个课程会根据实施情况采取不同的搭乘方式。

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. 
    } 
}