场景描述
假设一下,现在眼前有各种各样的玩具,比如玩偶,奥特曼,巴士、飞机、轮船等。为了方便管理和展示,你决定把这些玩具按照类别进行分类,比如将交通工具都放置在一个箱子里。
现在,让我们把这个场景翻译成 Java 的术语:
- 父类Vehicle就像是你用来装玩具的大箱子,它代表了一类玩具共同的特性,比如都有颜色、大小等。
- 子类Bus, Plane, Boat等这些是具体的玩具种类,它们都继承了“Vehicle”这个大类别的特性,但每种玩具都有自己独特的特点,比如巴士可以在地面行驶,飞机可以在天空中飞,轮船可以在水面上行驶。
如何使用
- 创建子类对象:你可以在放置一辆具体的玩具汽车。
- 使用父类引用:你拿着一个写着“Vehicle”的标签,指向那辆玩具汽车。这个标签可以指向任何一种交通工具玩具,不管是汽车还是飞机。
- 多态性:当你通过标签(父类引用)与玩具互动时,比如让玩具移动,实际上发生的事情取决于你指向的具体玩具。如果是汽车,它就会在地上行驶;如果是飞机,它就会在空中飞。
为什么可以这样做
- 继承关系:就像所有的交通工具玩具都属于“Vehicle”这个大类别一样,所有的子类都是父类的一种特定形式。这意味着子类自动拥有了父类的所有属性和方法。
- 兼容性:因为子类继承了父类,所以父类引用可以安全地指向子类对象。就像“Vehicle”标签可以指向任何交通工具玩具一样,父类引用可以指向任何子类对象。
- 方法重写:子类可以重写父类的方法,这样当通过父类引用调用这些方法时,实际执行的是子类中定义的行为。这就好比你通过“Vehicle”标签让玩具移动,但具体怎么动取决于玩具本身的特性。
示例代码
// 父类 Vehicle
class Vehicle {
void move() {
System.out.println("交通工具在移动!");
}
}
// 子类 Bus
class Bus extends Vehicle {
@Override
void move() {
System.out.println("巴士在公里上行驶!");
}
}
// 子类 Plane
class Plane extends Vehicle {
@Override
void move() {
System.out.println("飞机在天空中飞行!");
}
}
// 主程序
public class Main {
public static void main(String[] args) {
// 创建子类对象
Bus bus = new Bus();
Plane plane = new Plane();
// 使用父类引用指向子类对象
Vehicle myBus = bus; // 指向 bus 对象
Vehicle myPlane = plane; // 指向 plane 对象
// 通过父类引用调用方法
myBus.move(); // 输出 "巴士在公里上行驶!"
myPlane.move(); // 输出 "飞机在天空中飞行!"
}
}
在上述个例子中:
- Vehicle 是一个基类,Bus 和 Plane 都继承了 Vehicle 。
- Bus 和 Plane 分别重写了 move() 方法。
- 在 main 方法中,myBus 和 myPlane 都是指向子类对象的父类引用。
- 当调用 move() 方法时,实际执行的方法取决于对象的实际类型,这就是多态。多态的好处在于它可以提高代码的复用性和灵活性。例如,在 move() 方法中,你可以返回任何类型的 Vehicle 子类对象,并且调用者不需要知道具体返回的是哪种交通工具。这种灵活性使得代码更容易维护和扩展。
相关知识
Java中的多态是一种面向对象编程的概念,它允许子类对象被当作父类对象来使用,从而使得程序更加灵活和可扩展。多态的存在基于三个前提条件:
- 继承:必须存在继承关系,即一个类(子类)继承另一个类(父类)。
- 方法重写:子类重写了父类的方法。
- 向上转型:父类引用指向子类对象。