Java中的继承实例化类多态

时间:2014-03-12 22:16:39

标签: java inheritance polymorphism

写作有什么好处:

Bicycle bike = new RoadBike(...);

而不是

RoadBike bike = new RoadBike(...);

当然假设RoadBike extends Bicycle

我问,因为即使我写了

RoadBike bike = new RoadBike(...);

由于扩展,我仍然可以使用Bicycle中的所有方法,那么以另一种方式编写它的重点是什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

如果Bicycle是一个界面,它将允许你只是绕过该界面,使你的方法更“通用”或“多态”。

如果您有另一个班级StreetBike,(并且它实现了自行车界面),您可以使用该班级和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.
  }
}

答案 1 :(得分:1)

表达多态性的最清晰方式是通过抽象基类(或接口)

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

希望这能清除你的不同之处!

答案 2 :(得分:0)

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

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