【问题标题】: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 的基本原则之一。也就是说,在某些情况下,例如在使用 BicycleRoadBike 时以短方法使用时没有区别。还有一个方面是调用重载方法,这在编译时由引用类型确定(取决于引用类型,即使它们指向同一个对象,也可能调用不同的方法),但不建议使用这些类型的重载方法。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-27
        • 2020-06-14
        • 1970-01-01
        • 2020-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多