在Java中,继承和多态是面向对象编程的重要特性。让我们分别了解一下这两个概念以及如何在Java中使用它们。
继承 (Inheritance)
继承允许你定义一个类(称为子类或派生类)来继承另一个类(称为父类或基类)的属性和方法。继承的一个主要优点是可以复用代码并减少冗余。
示例代码
假设我们有一个基类 Vehicle
和两个子类 Car
和 Truck
。
1// 基类 Vehicle
2public class Vehicle {
3 private String brand;
4 private int year;
5
6 public Vehicle(String brand, int year) {
7 this.brand = brand;
8 this.year = year;
9 }
10
11 public String getBrand() {
12 return brand;
13 }
14
15 public int getYear() {
16 return year;
17 }
18
19 // 公共方法
20 public void displayInfo() {
21 System.out.println("Brand: " + brand + ", Year: " + year);
22 }
23}
24
25// 子类 Car
26public class Car extends Vehicle {
27 private int numberOfDoors;
28
29 public Car(String brand, int year, int numberOfDoors) {
30 super(brand, year);
31 this.numberOfDoors = numberOfDoors;
32 }
33
34 public int getNumberOfDoors() {
35 return numberOfDoors;
36 }
37
38 @Override
39 public void displayInfo() {
40 super.displayInfo();
41 System.out.println("Number of Doors: " + numberOfDoors);
42 }
43}
44
45// 子类 Truck
46public class Truck extends Vehicle {
47 private double payloadCapacity;
48
49 public Truck(String brand, int year, double payloadCapacity) {
50 super(brand, year);
51 this.payloadCapacity = payloadCapacity;
52 }
53
54 public double getPayloadCapacity() {
55 return payloadCapacity;
56 }
57
58 @Override
59 public void displayInfo() {
60 super.displayInfo();
61 System.out.println("Payload Capacity: " + payloadCapacity + " tons");
62 }
63}
64
65// 主类
66public class Main {
67 public static void main(String[] args) {
68 Car car = new Car("Toyota", 2022, 4);
69 Truck truck = new Truck("Ford", 2021, 2.5);
70
71 car.displayInfo();
72 truck.displayInfo();
73 }
74}
在这个例子中,Vehicle
是基类,它具有品牌和制造年份属性。Car
和 Truck
分别是 Vehicle
的子类,它们都有自己的特定属性。displayInfo()
方法在 Vehicle
类中定义,并在子类中被覆写以提供额外的信息。
多态 (Polymorphism)
多态是指一个接口可以有多种不同的实现方式。在Java中,多态可以通过方法重载和方法覆写来实现。方法重载是在同一个类中使用相同的方法名但参数列表不同;方法覆写是在子类中重新定义父类的方法。
示例代码
在上述示例中,我们已经展示了方法覆写来实现多态。现在,我们来看一个使用方法重载的例子:
1// 主类
2public class Main {
3 public static void main(String[] args) {
4 Vehicle vehicle = new Vehicle("Honda", 2020);
5 Car car = new Car("Toyota", 2022, 4);
6 Truck truck = new Truck("Ford", 2021, 2.5);
7
8 vehicle.displayInfo();
9 car.displayInfo();
10 truck.displayInfo();
11
12 // 多态示例 - 使用父类引用指向子类对象
13 Vehicle v1 = car; // Upcasting
14 Vehicle v2 = truck; // Upcasting
15
16 v1.displayInfo();
17 v2.displayInfo();
18
19 if (v1 instanceof Car) { // Downcasting
20 Car c = (Car) v1;
21 System.out.println("Number of Doors: " + c.getNumberOfDoors());
22 }
23
24 if (v2 instanceof Truck) {
25 Truck t = (Truck) v2;
26 System.out.println("Payload Capacity: " + t.getPayloadCapacity() + " tons");
27 }
28 }
29}
在这个示例中,我们使用了父类 Vehicle
的引用指向子类的对象,这是多态的一种形式。此外,我们还展示了向下转型(downcasting),即从父类引用转换到子类引用,以便访问子类特有的方法。
总结
- 继承:允许子类继承父类的属性和方法,可以减少代码重复。
- 多态:允许使用父类的引用调用子类的方法,提高了代码的灵活性和可扩展性