面向对象的三大特征之一继承

news/2025/1/23 4:09:22/

继承

继承的特性

  • 概念:可以使得子类具有父类的属性(成员变量)和方法(成员方法),还可以在子类中重新定义,追加属性和方法。

  • 继承的格式: public class 子类名 extends 父类名{}

  • 父类:基类、超类 子类:派生类

  • 继承中子类的特点:

    • 子类可以有父类的内容(继承父类非私有的属性和方法
    • 子类还可以有自己特有的内容(自己重新定义新的属性和方法)
    public class Animal{private String name;public void show(){System.out.println("你好!");}
    }
    // 子类继承父类,可以继承非私有的,
    public class Dog extends Animal{private int age;						// 子类自己特有的内容}
    public class Test{public static void main(String args[]){// 创建一个狗的对象Dog d = new Dog();// 调用方法d.show();							// 我们看 Dog 类中并无 show() 方法,但是调用并不出错,是因为继承了父类}
    }
    

继承的好处

  • 提高了代码的复用性(多个类相同的成员可以放到同一个类中)

  • 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)

    // 比如人类,和学生、老师、工人
    public class Person{private String name;private int age;public void eat(){System.out.println("吃饭!");}
    }
    // 学生继承人类
    public class Student extends Person{}
    // 老师继承人类
    public class Teacher extends Person{}
    // 工人继承人类
    public class Worker extends Person{}
    

    我们可以看到,学生、老师、工人,都可以继承人类,提高了代码的复用性,我们知道,继承非私有的成员方法和成员变量,都可以继承 eat() 方法,那我们只需要Person类中修改 eat() 方法,那学生、老师、工人继承的也都修改了,这样提高了代码的维护性

继承的弊端

  • 继承让类与类之间产生了关系,类的耦合性增强了
  • 父类变化时,子类也随着变化,削弱了子类的独立性

什么时候使用继承

  • 继承体现关系:is a (有两个类A和B,满足A是B的一种,或者B是A的一种,就说说明他们存在继承关系)

继承中成员变量访问的特点

  • 在子类中访问一个变量

    • 子类局部范围找(可简单理解为方法内)
    • 子类成员范围找(类内)
    • 父类成员范围找

    注意:不考虑父亲的父亲,也就是说,假设子类和其父类中都无这个变量,就报错!

继承中成员方法访问的特点

  • 通过子类对象访问一个方法

    • 子类成员范围找
    • 父类成员范围找

    注意:不考虑父亲的父亲

super 关键字

  • 通过上述的一些特性之后,我们发现,继承是子类和父类的关系,我们涉及到了在子类中访问父类的概念,this 关键字是指代本类对象,我们需要找到一个指代父类对象的关键字–super。

    形式作用
    super.age访问父类成员变量
    super.成员方法(…)访问父类成员方法
    super(…)访问父类的构造方法

    注意:括号中的 “…” 是代表参数的意思,参数个数是 从 0 到多个

继承中构造方法的访问特点

  • 接下来我们看段代码,来了解下,继承中构造方法的访问特点

    public class Animal{private String name;private int age;// 构造方法public Animal(){// ③}public Animal(String name , int age){	  // ④	this.name = name;this.age = age;}
    }// 继承动物类
    public class Dog extends Animal{				// 产生继承关系public Dog(){super();								// ①}public Dog(String name , int age){super(name,age);						// ②}
    }
    
  • 我们先看 ①和③ 的区别,在③中并无 super() 这行代码,根据我们super关键字的学习,我们知道 super() 其实就是调用 父类的 无参构造方法,其实也就是 调用 ③所在的 无参构造方法,那为什么 ③ 这行没写呢,其实自带 super() 只不过我们看不到而已。

  • 根据上述这句话,我们思考一个问题:那 Animal 类中无参构造也有 super() 这行代码,那Animal 明明没有父类啊,那他调用的是谁呢?

    // 这个就涉及到我们说的,所有类的祖宗类是谁呢,就是我们的 Object
    public class Animal extends Object{		// 原本这行应该这样写,只不过默认不写罢了}
    
  • 看完①和③ 的区别之后,我们看 ②和④的区别,那 ②相当于调用了 ④,那④中有没有 super() 这行代码呢,可以根据下面两图,发现,super(),只能在构造方法的第一行

综上所述:

​ ①:子类继承父类中的数据,可能使用父类中的数据,所以子类初始化之前,一定要完成父类数据的初始化

​ ②:每一个子类构造方法的第一条语句默认都是: super()

继承的注意事项

  • Java中类只支持单继承,不支持多继承

  • Java中类支持多层继承

方法重写(Override)

  • 学继承后,我们知道,子类会继承父类的成员方法,但是我们不想要父类的方法,怎么办呢?那就是方法的重写。举个列子:你继承了你父亲的公司,但是你不想按照父亲的来,你重新调整公司的模式和经营方向,这就可理解为方法重写。
  • 特点:
    • 子类中出现了和父类一模一样的方法声明(下述代码,会讲解什么是定义什么是声明)
    • 子类有自己特有内容的时候,重写父类中的方法
    • 父类中的私有方法子类无法重写(父类私有成员子类是不能被继承的)
    • 子类重写方法时候,访问权限(即权限修饰符,可点击了解这篇文章)不能比父类低
public class Person{private String name;private int age;public void show(){System.out.println("我是人类!");}// 私有无法被继承private void eat(){System.out.println("人类要吃饭!");}
}
public class Student extends Person{// 方法重写public void show(){						System.out.println("我是学生!");}
}

注意:

①:public void show() 就是方法的声明
②:public void show(){} 就是方法的定义


http://www.ppmy.cn/news/1346891.html

相关文章

小白水平理解面试经典题目LeetCode 71. Simplify Path【Stack类】

71. 简化路径 小白渣翻译 给定一个字符串 path ,它是 Unix 风格文件系统中文件或目录的绝对路径(以斜杠 ‘/’ 开头),将其转换为简化的规范路径。 在 Unix 风格的文件系统中,句点 ‘.’ 指的是当前目录,…

NLP深入学习:《A Survey of Large Language Models》详细学习(五)

文章目录 1. 前言2. Prompts2.1 Prompting2.1.1 Prompt 构建2.1.2 Prompt 优化 2.2 上下文学习2.2.1 ICL 公式化2.3 演示设计 2.3 思维链 Prompt2.3.1 改进的 CoT Prompt 策略2.3.2 深入讨论 2.4 解决复杂任务的规划方法2.4.1 规划生成2.4.2 反馈获取2.4.3 规划细化 3. 参考 1.…

jsp康养小镇管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP康养小镇管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&a…

数据库管理-第147期 最强Oracle监控EMCC深入使用-04(20240207)

数据库管理147期 2024-02-07 数据库管理-第147期 最强Oracle监控EMCC深入使用-04(20240207)1 发现Exadata2 Exadata监控计算节点:存储节点RoCE交换机管理交换机PDU 总结 数据库管理-第147期 最强Oracle监控EMCC深入使用-04(202402…

龙芯安装Docker

本文章使用龙芯3A6000处理器,Loongnix操作系统。 官方文档: http://docs.loongnix.cn/loongnix/cloud/docker/manual.html 1 安装Docker 1.1 卸载docker sudo apt remove docker1.2 更新 sudo apt update1.3 安装Docker sudo apt install docker-ce …

【集合系列】TreeMap 集合

TreeMap 集合 1. 概述2. 方法3. 遍历方式4. 排序方式5. 代码示例16. 代码示例27. 代码示例38. 注意事项 其他集合类 父类 Map 集合类的遍历方式 TreeSet 集合 具体信息请查看 API 帮助文档 1. 概述 TreeMap 是 Java 中的一个集合类,它实现了 SortedMap 接口。它是…

MySQL的MVCC机制

MVCC机制 使用MVCC(Multi-Version Concurrency Control,多版本的并发控制协议)机制来实现可重复读(REPEATABLE READ)的隔离级别 MVCC最大的优点是读不加锁,因此读写不冲突,并发性能好。InnoDB实现MVCC,是通过保存数据在某个时间点…

08-Java过滤器模式 ( Filter Pattern )

Java过滤器模式 实现范例 过滤器模式(Filter Pattern)或允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 过滤器模式(Filter Pattern) 又称 标准模式(Criteria Pattern…