编译软件:IntelliJ IDEA
一.简单来说,继承就是面向对象编程中的一个重要概念,它允许一个类(子类)从另一个类(父类)中继承属性和方法。这种机制使得子类可以复用父类的代码,并在此基础上扩展或覆盖原有的功能。
那么我们为什么要用继承呢?
-
代码复用:通过继承,子类可以重用父类的属性和方法,避免了在每个子类中重复编写相同的代码。这样可以减少开发时间和维护成本。
-
模块化设计:通过将通用的属性和行为抽象到一个基类(父类)中,可以更好地组织代码结构,提高程序的可读性和可维护性。
-
多态性支持:继承是实现多态性的基础。子类可以覆盖或扩展父类的方法,使得同一消息可以根据接收对象的不同产生不同的行为。
-
接口实现:虽然面向对象语言通常也提供接口来实现多态,但有时继承仍然是实现特定接口的一种有效方式。
-
层次结构模型:继承可以帮助我们创建反映现实世界中的层级关系的模型,如“动物”是一个通用的概念,而“猫”和“狗”都是更具体的动物类型。
继承的方法也有很多种,如:
- 单一继承:一个子类只能有一个直接的父类。
- 抽象基类:不能实例化的类,用于提供通用接口供其他类继承。
- 混合继承:使用接口和类的组合来实现多重继承的效果。
PS:在Java中不存在多重继承
二.子类继承父类时使用extend关键字,并且继承是is-a的关系.如:
* public class Dog extends Pet{}
* Dog是一个Pet
①当父类和子类有重名属性时,this.属性的查找顺序是:先在子类中查找,再到父类中找
②如果想要在子类中调用到的是父类的属性,则用super.进行调用
③在Java中所有的类都直接或间接的继承了Object类
大家可能会对super有点陌生,这里我展开说说:
(1)super代表父类
(2)super可以调用父类中的属性,方法,构造方法
(3)supe调用构造方法时必须=写在第一句
(4)super和this在调用构造方法时,不能同时出现
三.重写:
重写:父类中的方法不能满足子类的需求,就可以在子类中对父类的方法进行重新定义(覆盖),以满足需求.
- 重写前提:在继承关系中
在继承中,子类方法的声明和父类一致,访问修饰符和父类一样或比父类大,方法的实现(方法体)不一样
这里举个例子:
// 父类:Animal
public class Animal {
public void speak() {
System.out.println("动物发出声音");
}
}
// 子类:Dog
public class Dog extends Animal {
public void speak() {
System.out.println("汪汪叫");
}
}
在这个例子中,我们有一个Animal
基类和一个Dog
子类。Animal
类有一个speak()
方法,输出“动物发出声音”。在Dog
类中,我们重写了speak()
方法,使其输出“汪汪叫”。
当我们通过Animal
类型的引用调用speak()
方法时,会根据实际创建的对象类型来决定调用哪个版本的方法。这也是多态性的一个体现。
四.抽象:
在一些面向对象编程语言中,可以使用抽象类来创建不能实例化的类,仅作为其他类的基类使用。抽象类通常包含一些抽象方法,这些方法没有实现,需要由其子类去实现。通过这种方式,抽象类定义了必须实现的基本功能,而子类则负责具体的实现细节。
- 抽象用abstract修饰,可以修饰类和方法
- 抽象类不能实例化,所以可以省略构造方法
- 抽象方法没有方法体,可以在子类中进行重写
- 抽象方法一定在抽象类中,抽象类中不一定都是抽象方法
抽象的主要目的是简化设计和实现,并提高代码的可复用性。通过分离关注点,我们可以更好地组织代码结构,使代码更易于理解和维护。同时,抽象也是实现多态性的基础,有助于构建灵活、可扩展的软件系统。
在有限的篇幅内,我已尽力将文章撰写到此。若文中存在不足或错误之处,欢迎各位不吝指正。关于继承的基础内容,我大致已经阐述完毕。然而,后续还有更多相关主题等待探讨,例如接口、多态等。我会逐步完善这些内容,以期为大家呈现一个全面而深入的理解。