3.3 继承
继承的原理:
继承用于解决代码复用性
继承的本质就是对某一批类的抽象,即取一批类的共同有的属性和方法组成一个父类;继承也是类和类之间的一种关系
继承通过在类名后面加上extends +父类名 来实现, 也就是子类是父类的扩展
子类继承了父类就会拥有父类的全部方法和属性 前提是,父类的方法和属性修饰符是public
修饰符的优先级:
- public 最高的,继承一般用这个
- protected
- default 定义属性和方法时什么都不写就是这个
- private 私有的无法被继承,封装属性的时候才用到
继承的小细节:
- 子类继承了所有的属性和方法,非私有的属性和方法可以直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供的公共的方法去访问 即get方法调用属性,定义一个方法再调用这个私有方法,就可以让子类访问父类的私有属性和私有方法
- 子类必须调用父类的构造器,完成父类的初始化
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会取调用父类的无参构造器,如果父类没用提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成堆父类的初始化工作
- 如果希望指定去调用父类的某个构造器,则显示的调用一下:super(参数列表);
- super在使用时,必须放在第一行
- super和this都只能在构造器的第一行,因此它们不能共存
- java所有类都是Object的子类
- 构造器的调用不限于直接父类,将一直往上追溯到Object类
- 子类只能继承一个父类(指直接继承),java是单继承机制
- 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系
快捷键:ctrl + h 快速查看继承关系
在JAVA中所有的类都默认直接或间接继承object 这个类,也就是说创建了一个类,他默认继承object
继承的原理:
**
public class ExtendsTheory {
public static void main(String[] args) {
Son son = new Son();
//为什么son.name返回是大头儿子?原因是按照查找关系来返回信息
/**
* (1)首先看子类是否有该属性
* (2)如果子类有,并且可以访问,则返回信息
* (3)如果子类没有这个属性,就看父类有没有这个属性(如果父类有,并且可以访问,则返回信息)
* (4)如果父类没有就按照(3)的规则,继续找上级父类,直到Object类
* 提示:如果父类找到了,但是不能访问,则报错
*/
System.out.println(son.name); //son.name返回的是大头儿子
System.out.println(son.age); //son.age返回的是39
System.out.println(son.hobby); //son.age返回的是旅游
}
}
class GrandPa{
String name="大头爷爷";
String hobby="旅游";
}
class Father extends GrandPa{
String name="大头爸爸";
int age=39;
}
class Son extends Father{
String name="大头儿子";
}
super与this:
super用于子类调用父类的方法、属性、构造器;this用于调用自己本身类的方法、属性、构造器
当子类中有父类中的方法和属性重名时,为了访问父类的成员,必须通过super,如果没有重名,用super、this、直接访问是一样的效果!
super的注意点:
- 子类的构造器里有一行隐藏代码:super(); 来默认调用了父类的无参构造
- 子类的构造器里,若把隐藏代码显示出来必须在子类构造器的第一行
- super必须只能出现在子类的方法或者构造方法中
- super();和this();不能同时调用构造器
- 私有的方法和属性无法通过super调用,即private的无法被继承
- super的访问不限于直接父类,如果爷爷类和本类中有同名的方法和属性,也可用使用super去访问爷爷类的,;如果多个上级类中都有同名的方法和属性,使用super访问遵循就近原则 A->B->C
super与this的区别
- this 表示本身调用者这个对象 super 代表父类对象的引用
- this没有继承也可以使用 super只能在继承条件下才可以使用
- this(); 调用本类的构造器 super();调用父类的构造器
方法的重写:
方法的重写就是子类有一个方法,和父类的某个方法的名词、返回类型、参数一样,即除了方法体之外其他完全一样,那么这类的这个方法就重写了父类的方法(子类和父类不一定是一层的关系,也可以是爷爷类)
重写的原理:是由于查找关系
重写都是方法的重写,与属性无关
重写:子类的方法必须和父类一致,方法体不同!
为什么需要重写?
- 父类的功能,子类不一定需要或者不一定满足
重写的细节:
- 子类的方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样
- 子类方法的返回类型和父类方法的返回类型一样,或者是父类返回类型的子类
- 如父类是Object 子类可以是String;父类是String,子类不能为Object
- 子类方法不能缩小父类方法的访问权限,但可以扩大
- public -->protected -->default -->private
- 子类抛出的异常不能扩大父类的异常
重载和重写的比较:
静态方法的调用只和定义数据类型有关
非静态方法的调用,子类会重写了父类的方法,这个就是方法的重写,即new了一个子类的对象,即使引用指向了父类,子类也会重写了父类的方法;
所以方法的重写只和非静态方法有关!!!
快捷键:alt + insert 重写方法 生成的方法是默认调用了父类的方法,可以修改
总结:
- 方法的重写只出现在子类继承了父类,且父类是非静态方法
- 子类重写父类方法
- 方法名必须相同、参数列表也必须相同,否则就是重载了
- 修饰符:重写的范围可以扩大,不能缩小
- public-->protected-->default-->private
- 抛出的异常:范围可以被缩小,但不能扩大
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器