面向对象 - 继承
为什么需要继承
一个小问题 , 还是看个程序com.edu.extend_ 包: Extends01.java , 提出代码复用的问题.
解 决 方 案 : 用继承来解决代码的复用性
●继承基本介绍
继承可以解决代码复用, 让我们的编程更加靠近人类思维, 当多个类存在相同的属性(变量) 和方法时, 可以从这些类中抽象出父类, 在父类中定义这些相同的属性和方法, 所有的子 类不需要重新定义这些属性和方法只需要通过extends声明继承父类即可。
●继承的基本语法
class 子类 extends 父类{ }
-
子类就会自动拥有父定义的属性和方法
-
父类又叫 超类,基类。
-
子类又叫 派生类。(子类之后也可以再去分出子类)
继承给编程带来的便利
-
代码的复用性提高了
-
代码的扩展性和维护性提高了
继承的深入讨论/细节问题
-
子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访 问,要通过父类提供公共的方法去访问
-
子类必须调用父类的构造器, 完成父类的初始化
-
当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无 参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
-
如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)
-
super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
-
super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
-
java 所有类都是 Object 类的子类, Object 是所有类的基类.
-
父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)
-
子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。
思考:如何让 A 类继承 B 类和 C 类? 【A 继承 B, B 继承 C】
-
不能滥用继承,子类和父类之间必须满足 is-a
继承的本质分析
案例
看一个案例来分析当子类继承父类,创建子类对象时,内存中到底发生了什么?
提示: 对象创建好后 ,建立查找的关系
package com.edu.extend_;
//讲解继承的本质
public class ExtendsTheory {
//Theory:理论原理
public static void main(String[] args) {
Son son = new Son();//内存的布局
System.out.println(son.name);
// 这时请注意,要按照查找关系来返回信息
//(1) 首先看子类是否有该属性
//(2) 如果子类有这个属性,并且可以访问,则返回信息
//(3) 如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息..)
//(4) 如果父类没有就按照(3)的规则,继续找上级父类,直到 Object...
}
}
class GrandPa { //爷类
String name = "大头爷爷";
String hobby = "旅游";
}
class Father extends GrandPa {//父类
String name = "大头爸爸";
int age = 39;
// public int getAge() {
// return age;
// }
}
class Son extends Father { //子类
String name = "大头儿子";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现