写作有什么好处:
Bicycle bike = new RoadBike(...);
而不是
RoadBike bike = new RoadBike(...);
当然假设RoadBike extends Bicycle
。
我问,因为即使我写了
RoadBike bike = new RoadBike(...);
由于扩展,我仍然可以使用Bicycle
中的所有方法,那么以另一种方式编写它的重点是什么?
谢谢!
答案 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的基本原则之一。也就是说,在某些情况下,例如在使用Bicycle
或RoadBike
时使用简短方法时没有任何区别。还有一个方面是调用重载方法,这些方法在编译时由引用类型确定(取决于引用类型,即使它们指向同一个对象也可能调用不同的方法),但不建议使用这些类型的重叠方法。
您可能会得到更好的解释here。