继承继承的作用抽取多个类的共性到父类子类直接复用父类的属性和方法减少重复代码便于扩展维护继承概念父类超类 / 基类存放共性属性和方法子类派生类继承父类拥有父类非私有成员同时可以扩展自己独有的属性 / 方法Java 中继承关键字extends核心特点Java 是单继承一个类只能直接继承一个父类不能 extends A,B子类不能继承父类 private 私有修饰的成员继承是is-a关系狗是动物、猫是动物符合 is-a 才适合用继承继承语法语法格式修饰符 class 子类 extends 父类 { // 子类自己的成员属性、方法 }extendsJava 关键字用来声明类和类之间的继承关系子类派生类继承父类的内容还可以扩展自己独有的功能父类基类 / 超类存放多个子类的公共代码重点子类会继承父类的成员变量、成员方法子类继承后一般要新增自己独有的成员继承的好处抽取公共代码减少重复代码方便后期维护父类成员访问核心总规则就近原则访问成员变量 / 方法优先在子类找子类有就用子类的子类没有再去父类查找父类也没有 → 编译报错子类访问父类【成员变量】父子类没有同名成员变量子类可以直接访问继承来的父类变量父子类成员变量同名a子类中定义了和父类同名变量直接访问优先使用子类自己的变量b) 变量访问口诀子类有优先子类子类没有去找父类public class Base { int a; int b; int c; }public class Derived extends Base{ int a; //和父类a 同名类型相同 char b; //和父类b 同名类型不同 public void method() { a100; // 访问之类自己的a ,就近原则 b101; // 访问之类自己的b ,就近原则 c102; //子类没有变量c , 就去父类找 } }public static void main(String[] args) { Derived d1new Derived(); d1.method(); System.out.println(d1.a); System.out.println(d1.b); System.out.println(d1.c); }子类访问父类【成员方法】情况 1方法名字不同a就近原则优先找子类自己的方法找不到再去父类找public class Base { //父类 public void methodA() { System.out.println(Base中的methodA()); } }public class Derived extends Base{ public void methodB() { System.out.println(Derived 中的methodB() ); } public void methodC() { methodA(); //先找之类中找methodA()方法之类中找不到 // 再到父类中找,父类中找不到就报错 methodB(); //调用之类的methodB() 方法 // methodD(); //编译报错子类父类都找不到 methodD() 方法 } }public static void main(String[] args) { Derived d1new Derived(); d1.methodC(); }情况 2方法名字相同a子类写了和父类同名方法直接调用时优先执行子类的方法这就是方法重写overridepublic class Base { public void methodA() { System.out.println(Base中的methodA()方法); } public void methodB() { System.out.println(Base中的methodB()方法); } }public class Derived extends Base{ public void methodA() { System.out.println(Derived中的methodA()方法); } public void methodB() { System.out.println(Derived中的methodB()方法); } public void methodC() { methodA(); // 优先调用子类重写的methodA()方法 methodB(); // 优先调用子类重写的methodB() 方法 } }public static void main(String[] args) { Derived d1new Derived(); d1.methodC(); }补充如果同名方法参数列表不一样属于方法重载根据传入参数匹配调用哪个方法如果同名、参数列表一样就是方法重写直接调用优先子类super 关键字super 的作用asuper在子类方法中访问父类的成员成员变量、成员方法、构造方法当子类和父类存在同名成员时直接访问默认访问子类自己的成员想要访问父类的同名成员就要用superpublic class Base { int a; int b; public void methodA() { System.out.println(Base中的methodA()方法); } public void methodB() { System.out.println(Base中的methodB()方法); } }public class Derived extends Base{ int a; //和父类变量a 同名 //重载方法名相同参数列表不同 public void methodA(int a) // 这里构成重载子类的methodA()方法和父类的方法名相同参数列表不同 { System.out.println(Derived 中的methodA()方法); } // // 重写方法名相同参数列表相同 // public void methodB() // { // System.out.println(Derived 中的methodB()方法); // } // Override public void methodB() { System.out.println(Derived 中的methodB()方法); } public void methodC() { a100; //等价this.a 方位子类的变量a b101; // 子类没有b自动访问父类继承b super.a200; //super.a 访问父类的成员变量a super.b210; // super.b 访问父类的b //重载methodA() 方法 methodA(); // 无参方法 : 子类没有无参的methodA() 调用父类的 Base.methodA() methodA(20) ;// 有参方法 匹配子类自己的methodA(int)方法 // 重写方法 methodB() methodB(); //直接调用优先执行子类重写后的methodB() 方法 super.methodB(); //super. 方法强制调用父类的methodB()方法 }public static void main(String[] args) { Derived d1new Derived(); d1.methodC(); }super 的 3 个用途asuper. 成员变量访问父类的成员变量bsuper . 成员方法()访问父类的成员方法csuper(...) 调用父类的构造方法注意事项asuper 只能在非静态方法普通成员方法 / 构造方法里使用static静态方法中不能用 superbsuper 只能在子类中访问父类的成员csuper 代表子类对象里面继承来的父类部分不是一个独立对象区分重载和重写a重载同一个类中或者父子类方法名相同参数列表不同调用时靠参数区分不需要 superb重写子类和父类方法名、参数、返回值完全一致直接调用优先子类想调用父类版本必须 super子类构造方法分析代码1报错原因aJava 规定创建子类对象时子类构造方法默认第一行隐含 super()调用父类无参构造b父类Base只定义了带一个 int 参数的构造方法Base(int a)没有无参构造方法c子类Derived()构造默认尝试调用super()父类无参构造但是父类不存在无参构造所以编译失败解决方法a当类中手动写了带参构造编译器不会再自动生成默认无参构造b子类构造第一行显式写super(实参)调用父类的带参构造分析代码2总结对象构造顺序先父类后子类b子类对象由两部分组成从父类继承的成员 子类新增成员a必须先把父类部分初始化完成再初始化子类super()规则a子类构造方法中默认第一行隐含super()调用父类无参构造b如果父类只有带参构造没有无参构造子类构造必须手动写super(参数)并且必须写在构造方法第一行csuper(...)只能在子类构造方法中使用只能出现一次不能和this(...)同时存在父类构造的生成规则a一个类如果没有写任何构造方法编译器自动生成一个默认的无参构造b如果手动写了任意构造带参编译器不再提供默认无参构造易混点super()调用父类构造方法只能写在子类构造第一行super.成员访问父类成员变量 / 成员方法this()调用本类其他构造方法同样必须放在构造第一行不能和super()共存继承中代码块初始化顺序无继承时的初始化顺序public class Person { public String name; public int age; public Person(String name,int age) { this.namename; this.ageage; System.out.println(构造方法执行); } //实例代码块 { System.out.println(实例代码块执行); } //静态代码块 static { System.out.println(静态代码块执行); } }public static void main(String[] args) { Person p1new Person(李1,21); System.out.println(----------------------); Person p2new Person(李2,22); System.out.println(----------------------); Person p3new Person(李3,23); }结论a静态代码块类加载阶段执行只执行 1 次优先于实例相关代码b创建对象时实例代码块先执行然后执行构造方法c实例代码块在每次new对象都会执行静态代码块只在类加载执行一次有继承关系的初始化顺序public class Person { public String name; public int age; public Person(String name,int age) { this.namename; this.ageage; System.out.println(Person: 构造方法执行); } { System.out.println(Person: 实例代码块执行); } static{ System.out.println(Person: 静态代码块执行); } }public class Student extends Person{ public Student(String name,int age) { super(name,age); System.out.println(Student: 构造方法执行); } { System.out.println(Student实例代码执行); } static { System.out.println(Student: 静态代码块执行); } }public static void main(String[] args) { Student stu1new Student(张三,21); System.out.println(); Student stu2new Student(李四,22); }顺序a先静态后实例先父类后子类静态部分类加载时只跑一次父类静态代码块 → 子类静态代码块每次new创建子类对象实例部分每次新建对象都会跑父类实例代码块 → 父类构造方法 → 子类实例代码块 → 子类构造方法结论a父类静态代码块优先于子类静态代码块执行是最先执行b接着执行父类实例代码块 → 父类构造方法c再执行子类实例代码块 → 子类构造方法d第二次 new 子类对象时父类、子类静态代码块不再执行静态代码块只随类加载执行一次面试常考点a静态只加载一次b实例代码块在本类构造方法之前执行super()调用父构造是实例阶段第一步继承初始化顺序总结a加载类阶段父 static → 子 staticb每次实例化对象父实例代码块 → 父构造器 → 子实例代码块 → 子构造器访问修饰符四个访问权限总表修饰符private私有a只能在当前类内部访问b子类、同包其他类、其他包全部不能访问default默认权限不加关键字a也叫包访问权限b只能同一个包里的类访问跨包不行哪怕是子类也不行protected受保护规则a同包任意类都能访问和 default 一样b不同包只有子类通过自己的实例才能访问父类的 protected 成员重点坑点子类不能访问其他子类对象的 protected 成员跨包子类只能访问自己继承来的 protected不能访问别的子类实例的 protectedpublic公共a任何地方任何包不管是不是子类都可以访问使用原则封装思想Java 面向对象封装隐藏内部细节只对外暴露必要内容优先使用权限严格的修饰符aprivate default protected publicb能private就不要用public不要无脑全部字段private、全部方法public继承方式Java 中的继承方式Java 类只支持单继承不支持一个类直接同时继承多个父类多继承单继承aB extends AB 类直接继承 A 类一个子类只有一个直接父类public class A {} public class B extends A {}多层继承继承链aC 继承 BB 继承 AC 可以拿到 A、B 的成员b) 开发规范继承层次不要超过 3 层层次太多代码难维护需要重构public class A {} public class B extends A {} public class C extends B {}不同类继承同一个父类aB 和 C 都直接继承 AB、C 是兄弟类互相不能访问对方特有成员public class A {} public class B extends A {} public class C extends A {}补充Java 类不支持多继承class C extends A,B语法直接报错Java 可以通过接口间接实现多实现效果final 关键字final 可以修饰 变量、类、方法修饰变量 / 成员字段 → 常量值不能修改final int a 10; a 20; // 编译报错final变量赋值后不可修改修饰类 → 这个类不能被继承final public class Animal {} public class Bird extends Animal{} // 编译报错不能继承final类修饰方法 → 该方法不能被子类重写 (override)继承 和 组合核心区分is-a 用继承has-a 用组合继承关系is-a是一种例如猫是动物、狗是动物特点子类继承父类所有可访问成员强耦合破坏封装代码复用通过继承拿到父类属性方法组合关系has-a包含有一个例如汽车有轮胎、汽车有发动机汽车不是轮胎特点把一个类的对象作为另一个类的成员变量无 extends耦合低推荐优先使用选择原则能用组合尽量用组合减少继承带来的强耦合问题继承适合描述 “是一种” 的分类关系组合适合描述 “由 xxx 组成” 的包含关系组合public class Tire { public void roll() { System.out.println(轮胎转动); } }public class Engine { public void run() { System.out.println(发动机启动); } }//汽车类组合Tire 和 Engine public class Car { //将其他类的实例作为当前类的成员变量就是组合 private Tire tire; private Engine engine; //构造方法给轮胎发动机赋值 Car(Tire tire,Engine engine) { this.tiretire; this.engineengine; } //getter 获取对象 public Tire getTire() { return tire; } public Engine getEngine() { return engine; } // 汽车开动 public void drive() { engine.run(); tire.roll(); } }public class test { public static void main(String[] args) { Tire tnew Tire(); Engine enew Engine(); Car carnew Car(t,e); car.drive(); } }组合是has-axx 拥有 xx组合的优点a耦合度低轮胎、发动机独立修改轮胎类不会影响 Carb灵活运行时可以更换不同的轮胎对象c规避继承的缺点Java 类单继承限制
企业数字化 ERP 产品动态
相关推荐
第 09 篇:重排——Rerank 与 RRF 第 09 篇:重排——Rerank 与 RRF第 08 篇结尾把一件事按下了:“名单怎么从候选变成上下文,是拿到名单以后的事。”
这一篇就把它打开。夹在检索与生成之间的那一步叫重排,
它回答的是同一个问题的两半:几十条候选里&am… · 2026/9/24 17:52:51
第 08 篇:检索——相似度阈值、元数据过滤与混合检索 第 08 篇:检索——相似度阈值、元数据过滤与混合检索第 07 篇收尾留了四个“换库前先自问”的问题:ID 形状、元数据类型、过滤语义、写入可见性。
其中“过滤语义”最悬——当时只证明了 ES 把 Filter.Expression 翻成查询串文本、
or 会翻出语义问题&am… · 2026/9/24 17:52:51
2026年9月 我的“听歌识曲”项目实践过程(10) 今天,我引入了 Kafka 消息队列,将音频识别改造为异步处理架构,实现了“秒回”接口的削峰填谷。import sys
import os
import json
from confluent_kafka import Producer, Consumersys.path.append(os.path.dirname(os.path.dirname(os.path.… · 2026/9/24 17:52:51
华硕天选笔记本睡眠黑屏排查指南:从驱动到BIOS的完整解决方案 不少华硕天选用户应该都撞过这堵墙:笔记本合盖或闲置一会儿再打开,屏幕死活不亮,键盘灯倒是亮着,风扇偶尔还转一下,按什么键都没反应,最后只能长按电源键强制重启,重启后一看——之前没保存的文… · 2026/9/24 19:09:17
systemd服务管理实战:systemctl命令、unit文件与target机制详解 RH124系列的第八篇总结,我打算把systemd服务管理这部分好好拆开讲一讲。很多人在前面学文件、用户、权限时觉得还能应付,一到进程和服务就开始懵:明明命令敲了,状态也显示active,为什么一重启服务又不见了?… · 2026/9/24 19:09:17
华硕天选睡眠唤醒黑屏?从驱动到BIOS的完整排查指南 1. 先说现象:天选本睡死过去的真实场景华硕天选系列在游戏本里销量一直不低,尤其是学生党和刚工作的朋友买得最多,性价比确实能打。但这台机器有一个让不少用户抓狂的老毛病:合上盖子或者让系统睡眠一段时间后,再按键盘… · 2026/9/24 19:09:17
享元模式实战:C++粒子系统内存从1GB降至十几MB 先算一笔账。假设你正在用C开发一款2D射击游戏,场景里同一时间要刷出6万个弹幕粒子。每个粒子除了位置、速度这类每帧都在变的数值,还带了一份完整的纹理数据——贴图ID、颜色方案、混合模式,甚至位图内容本身。如果不做任何优化,… · 2026/9/24 19:09:17
千元档降噪耳机横评:地铁长途通勤实测谁更值得买? 这两年主动降噪耳机市场卷得是真凶,尤其是千元以内这个档位,几乎成了各家真无线耳机走量的主战场。我自己每天地铁通勤来回差不多一个半小时,周末又经常坐高铁跑长途,对所谓“通勤降噪”的需求一直很明确:第一… · 2026/9/24 19:09:17
Wayland与Xorg切换实操:Debian 13与Ubuntu 22.04配置指南 最近这段日子,我身边因为 Wayland 和 Xorg 切换炸毛的朋友比往年加起来都多。一边是刚装上 Debian 13(Trixie)的朋友,拿着 NVIDIA 显卡发现 GNOME 登录界面死活只有 Xorg 一个会话可选,查到的老教程全在讲“注销重选”… · 2026/9/24 19:09:04
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44