【基础】面向对象编程进阶:继承与多态
发布时间: 2024-06-28 22:38:14 阅读量: 10 订阅数: 22
![python物联网开发合集](https://img-blog.csdnimg.cn/050c21dc85fd4253b4dd17aca8ea8289.png)
# 2.1 继承的概念和类型
继承是面向对象编程中的一种机制,它允许一个类(子类)从另一个类(父类)继承属性和方法。继承提供了代码复用和扩展性的好处。
### 2.1.1 单继承和多继承
* **单继承:**一个子类只能从一个父类继承。Java和C++支持单继承。
* **多继承:**一个子类可以从多个父类继承。C++支持多继承,但Java不支持。
### 2.1.2 继承的访问控制
继承的访问控制规则决定了子类可以访问父类哪些成员。Java中,访问控制级别包括:
* **public:**子类可以访问父类的所有成员。
* **protected:**子类和子类的子类可以访问父类的所有成员。
* **default(包访问):**子类和同一包中的其他类可以访问父类的所有成员。
* **private:**子类不能访问父类的任何成员。
# 2. 继承的理论与实践
### 2.1 继承的概念和类型
**2.1.1 单继承和多继承**
继承是面向对象编程中一种重要的机制,它允许一个类(派生类)从另一个类(基类)继承属性和方法。
* **单继承:**一个派生类只能从一个基类继承。这是 Java 和 C++ 等大多数面向对象语言中采用的继承模型。
* **多继承:**一个派生类可以从多个基类继承。这在 C++ 等语言中支持,但由于菱形继承问题而很少使用。
**2.1.2 继承的访问控制**
继承的访问控制决定了派生类可以访问基类中哪些成员。Java 中的访问控制级别有:
* **public:**派生类可以访问所有 public 成员。
* **protected:**派生类和派生类的子类可以访问 protected 成员。
* **default(包访问):**只有与基类在同一个包中的派生类可以访问 default 成员。
* **private:**派生类无法访问 private 成员。
### 2.2 继承的应用场景
**2.2.1 代码复用和扩展性**
继承的主要优点之一是它允许代码复用。派生类可以继承基类的属性和方法,而无需重新实现它们。这可以减少代码冗余并提高代码维护性。
例如,考虑一个 `Animal` 基类,它定义了动物的共同特征(如名称和年龄)。我们可以创建 `Dog` 和 `Cat` 派生类,它们继承 `Animal` 的属性和方法,并添加特定于狗和猫的附加属性和方法。
**2.2.2 多态性的实现**
继承是实现多态性的基础。多态性允许对象以不同的方式响应相同的方法调用,具体取决于对象的类型。
派生类可以重写基类中的方法,从而提供相同方法的不同实现。当调用基类方法时,将调用派生类的重写方法。这允许我们编写通用的代码,该代码可以处理不同类型对象的集合。
例如,考虑一个 `Shape` 基类,它定义了 `draw()` 方法。我们可以创建 `Circle` 和 `Rectangle` 派生类,它们重写 `draw()` 方法以绘制不同的形状。当调用 `Shape` 的 `draw()` 方法时,将调用派生类的重写方法,从而绘制相应的形状。
# 3.1 多态的概念和原理
**3.1.1 方法重写和重载**
多态性是面向对象编程中的一项重要特性,它允许不同类型的对象对相同的操作表现出不同的行为。多态性主要通过方法重写和重载来实现。
**方法重写**是指在子类中重新定义父类中已存在的方法。重写的方法必须与父类方法具有相同的名称、参数列表和返回类型。当子类对象调用重写的方法时,将执行子类中的实现,而不是父类中的实现。
**方法重载**是指在同一个类中定义多个具有相同名称但参数列表不同的方法。重载的方法可以具有不同的返回类型。当调用重载的方法时,编译器将根据实际参数列表选择要执行的方法。
**代码示例:**
```java
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound.");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks.");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat meows.");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
animal.makeSound(); // 输出: Animal makes a sound.
Dog dog = new Dog();
dog.makeSound(); // 输出: Dog barks.
Cat cat = new Cat();
cat.makeSound(); // 输出: Cat meows.
}
}
```
**参数说明:**
* `makeSou
0
0