计算机学习笔记 从封装、继承到多态与抽象类全景解析(附带详细代码示例)
8.5 课程笔记整理从封装、继承到多态与抽象类全景解析1. 封装与权限控制1.1 封装思想定义隐藏对象的属性和实现细节仅对外提供公共访问方式。核心关注“如何调用”不关心“内部实现”。就像使用遥控器只需知道按键功能无需了解内部电路。1.2 实现方式私有化属性使用private修饰成员变量禁止外部直接访问。提供公共方法使用public的get/set方法作为唯一访问通道。public class Person { // 1. 私有化属性 private String name; private int age; // 2. 提供公共的 Getter/Setter public String getName() { return name; } public void setName(String name) { this.name name; } // Setter 中可以加入逻辑校验保证数据安全 public void setAge(int age) { if (age 0 age 120) { this.age age; } else { System.out.println(年龄不合法); } } }1.3 引用类型的封装安全深拷贝问题对于引用类型如Date、数组如果get方法直接返回引用外部仍可修改对象内部数据导致封装失效。解决在get方法中返回对象的副本深拷贝。import java.util.Date; public class User { private Date birthDate; // 错误的 Getter (浅拷贝) - 外部可修改 birthDate // public Date getBirthDate() { return birthDate; } // 正确的 Getter (深拷贝) - 返回副本 public Date getBirthDate() { return new Date(birthDate.getTime()); } }1.4 访问权限private仅限当前类内部访问。默认无修饰符当前类 同包。protected当前类 同包 子类。public所有地方。2. final 关键字2.1 修饰变量常量基本类型数值一旦赋值不可改变。引用类型引用地址指向的对象不可改变但对象内部的内容可以修改。public class FinalDemo { public static void main(String[] args) { // 1. 修饰基本类型 final int NUM 10; // NUM 20; // 报错无法再次赋值 // 2. 修饰引用类型 final int[] arr {1, 2, 3}; // arr new int[5]; // 报错引用地址不可变 arr[0] 99; // 正确对象内部内容可变 System.out.println(arr[0]); // 输出 99 } }2.2 修饰类与方法修饰类该类不能被继承断子绝孙类。修饰方法该方法不能被重写最终方法。// final class Father { } // 报错无法继承 final 类 class Father { public final void run() { System.out.println(父亲在跑); } } class Son extends Father { // Override // public void run() { } // 报错无法重写 final 方法 }3. 静态域与静态方法 (static)3.1 静态成员归属属于类本身所有对象共享同一份。调用通过类名.成员访问不依赖对象实例。内存类加载时分配内存静态常量池优先于对象存在。3.2 访问规则静态方法只能访问静态成员静态变量、静态方法。非静态方法可以访问静态成员和非静态成员。原因静态方法在对象创建前就存在无法访问依赖对象的非静态成员。public class StaticDemo { static int staticVar 1; int instanceVar 2; // 静态方法 public static void staticMethod() { System.out.println(staticVar); // 正确 // System.out.println(instanceVar); // 报错无法访问非静态变量 } // 非静态方法 public void instanceMethod() { System.out.println(staticVar); // 正确 System.out.println(instanceVar); // 正确 } }4. 参数传递机制4.1 值传递核心原则Java 中只有值传递。基本类型传递的是数值的副本。方法内修改不影响外部。引用类型传递的是地址值的副本。方法内修改对象属性会影响外部但修改引用指向如obj null不影响外部。public class PassByValueDemo { // 基本类型传递 public static void changeValue(int x) { x 100; // 修改副本不影响 main 中的 a } // 引用类型传递 public static void changeObj(Person p) { p.setName(李四); // 修改副本指向的对象内容影响 main 中的 person p new Person(); // 修改副本的指向不影响 main 中的 person p.setName(王五); } public static void main(String[] args) { int a 10; changeValue(a); System.out.println(a); // 输出 10 Person person new Person(张三); changeObj(person); System.out.println(person.getName()); // 输出 李四不是 王五 } }5. 方法重载 (Overload)5.1 定义在同一个类中允许存在多个同名方法但参数列表必须不同类型、数量、顺序。5.2 规则方法签名方法名 参数列表。无关项与返回值类型、访问修饰符无关。public class OverloadDemo { // 参数类型不同 public void add(int a, int b) { System.out.println(整数相加); } public void add(double a, double b) { System.out.println(小数相加); } // 参数数量不同 public void add(int a) { System.out.println(单个整数); } // 参数顺序不同 public void print(String s, int i) { } public void print(int i, String s) { } // public int add(int a, int b) { } // 报错与第一个方法签名冲突 }6. 构造器与初始化6.1 构造器特点方法名与类名相同。没有返回值类型连void都没有。创建对象时自动调用。6.2 默认初始化如果成员变量未显式赋值系统会赋予默认值int为0boolean为false引用为null。6.3 this() 调用在构造器中调用本类的其他构造器必须放在第一行。public class Person { private String name; private int age; // 无参构造 public Person() { this(匿名, 18); // 调用有参构造必须写在第一行 } // 有参构造 public Person(String name, int age) { this.name name; this.age age; } }7. 初始化块 (Initializer Block)7.1 定义使用{}包裹的代码块用于初始化属性。7.2 执行顺序面试重点静态代码块(static {})类加载时执行只执行一次。普通代码块({})每次创建对象时执行优先于构造器。构造器最后执行。public class InitDemo { static { System.out.println(1. 静态代码块); } { System.out.println(2. 普通代码块); } public InitDemo() { System.out.println(3. 构造器); } public static void main(String[] args) { new InitDemo(); new InitDemo(); } } // 输出 // 1. 静态代码块 // 2. 普通代码块 // 3. 构造器 // 2. 普通代码块 // 3. 构造器8. 继承与多态8.1 继承 (extends)单继承一个类只能有一个直接父类。多层继承A继承BB继承C。根类所有类默认继承Object。限制private成员不可继承final类不可继承。8.2 方法重写 (Override)定义子类定义与父类方法签名完全相同的方法。规则子类方法覆盖父类方法。调用时执行子类版本。对比重载重载看参数列表重写看继承关系且签名必须一致。class Animal { public void run() { System.out.println(动物跑); } } class Dog extends Animal { Override public void run() { System.out.println(狗跑); } // 重写 }8.3 多态 (Polymorphism)前提继承 重写。表现父类引用指向子类对象。规则编译看左边父类运行看右边子类。限制父类引用只能调用父类中定义的方法不能调用子类新增的方法。public class PolyDemo { public static void main(String[] args) { Animal a new Dog(); // 多态 a.run(); // 输出 狗跑执行子类重写的方法 // a.bark(); // 报错Animal 类中没有 bark 方法 } }8.4 强制类型转换向上转型自动小碗装大碗。向下转型强制大碗倒小碗需使用instanceof检查防止ClassCastException。Animal a new Dog(); Dog d (Dog) a; // 强制转换 d.bark(); // 调用子类特有方法8.5 总结子类继承父类之后可以用父类的所以方法重写过的就按照自己的方法运行和自己的方法。父类不能用子类的方法。父类强制转化为子类时可以用自己的方法和子类重写的方法。父类可以使用子类定义的所有数据类型。9. 继承中的初始化顺序面试重点当涉及继承时初始化顺序如下父类静态代码块子类静态代码块父类普通代码块父类构造器子类普通代码块子类构造器口诀静父 - 静子 - 普父 - 构父 - 普子 - 构子class Father { static { System.out.println(1. 父类静态); } { System.out.println(3. 父类普通); } public Father() { System.out.println(4. 父类构造); } } class Son extends Father { static { System.out.println(2. 子类静态); } { System.out.println(5. 子类普通); } public Son() { System.out.println(6. 子类构造); } } public class Test { public static void main(String[] args) { new Son(); } }10. 包 (Package) 与类库管理10.1 包的核心概念本质包Package本质上就是文件系统中的文件夹层级结构。作用避免命名冲突就像不同文件夹下可以有同名文件一样不同包下可以有同名类如com.jd.User和com.taobao.User。分类管理将功能相关的类组织在一起便于维护。10.2 命名规范规则通常采用公司域名的倒写形式以确保全球唯一性。示例京东com.jd百度某部门com.baidu.department110.3 导入机制 (Import)精确导入import java.time.LocalDate;优点清晰只加载需要的类。通配符导入import java.util.*;缺点内存消耗会将整个包下的类都加载到内存中。打包体积可能导致最终应用体积变大就像把整个书架搬回家而不仅仅是借一本书。静态导入import static java.lang.System.out;作用调用静态成员时可省略类名。示例out.println(Hello);代替System.out.println(Hello);。10.4 类库设计权衡 (Java vs C)C语言小而多。类库功能单一内存占用小但数量庞大开发者记忆负担重。Java大而全。功能打包在一起调用方便但可能包含未使用的功能占用更多内存。优化项目打包部署前应检测并剔除未使用的类以减小体积。11. 访问权限修饰符 (Access Modifiers)Java通过四种权限控制类成员的可见性。修饰符当前类同包子类其他包通俗理解public✅✅✅✅公开大门敞开谁都能进。protected✅✅✅❌受保护同包邻居能进不同包的亲戚子类也能进。(默认)✅✅❌❌包级私有仅限同包邻居跨包即使是亲戚也不行。private✅❌❌❌私有仅限自己谁都不让进。class Person { public String name; // 谁都能访问 protected int age; // 同包或子类能访问 int height; // (默认) 只有同包能访问 private String secret; // 只有自己知道 public void test() { name 张三; age 18; height 170; secret 密码; // 本类内部都可以访问 } }12. 抽象类 (Abstract Class)12.1 核心概念定义使用abstract修饰的类。它代表一个抽象概念不能实例化不能new。类比Animal动物是一个抽象概念现实中不存在叫“动物”的具体生物只有Cat、Dog等具体动物。作用作为子类的模板定义规范。12.2 抽象方法定义没有方法体{}的方法必须用abstract修饰。强制约束包含抽象方法的类必须是抽象类。继承抽象类的具体子类必须重写所有抽象方法。如果子类不重写子类也必须声明为抽象类。目的强制子类实现特定行为避免业务逻辑遗漏如忘记实现run方法。12.3 抽象类的特性构造方法抽象类可以有构造方法。作用供子类创建对象时通过super()调用用于初始化父类属性打地基。方法组成可以同时包含抽象方法强制子类实现和具体方法子类直接继承复用。12.4 关键限制abstract和final不能共存abstract要求被继承/重写final禁止继承/重写语义矛盾。abstract和static不能共存static方法随类加载而存在abstract方法无方法体无法调用没有意义。abstract class Animal { // 抽象方法强制子类实现 public abstract void run(); // 具体方法子类可直接复用 public void eat() { System.out.println(动物在吃东西); } } class Cat extends Animal { // 必须重写 run 方法否则编译报错 Override public void run() { System.out.println(猫在跑); } }13. 接口 (Interface) - 简介定义比抽象类更纯粹的抽象形式。特点接口中的方法默认都是抽象方法无需写abstract。实现接口的类实现类必须重写接口中所有方法。与抽象类的区别抽象类灵活可包含具体方法和抽象方法。接口纯粹早期版本中所有方法必须是抽象的侧重于定义规范。// 1. 定义一个 USB 接口规定好必须有什么功能 interface UsbInterface { // 抽象方法只声明不写具体实现 void start(); void stop(); } // 2. 手机类实现 USB 接口 class Phone implements UsbInterface { Override public void start() { System.out.println(手机开始连接电脑准备传输照片...); } Override public void stop() { System.out.println(手机安全断开连接。); } }肝死我了

相关新闻

Qwen3.6 27B蒸馏模型实战:单卡部署与性能评估指南

Qwen3.6 27B蒸馏模型实战:单卡部署与性能评估指南

上周,我花了一整天时间,试图让一个27B参数的大模型在单张消费级显卡上流畅地跑起来,同时还要保证它在代码生成和逻辑推理上的表现不掉链子。这听起来像是个不可能的任务,对吧?毕竟,27B模型通常意味着动辄几…

2026/11/7 2:21:47 阅读更多 →
AI驱动3D可视化开发:零基础构建交互式人体解剖应用

AI驱动3D可视化开发:零基础构建交互式人体解剖应用

“普通人也能用 AI 做出 3D 人体解剖应用?” 这听起来像是科技新闻里的标题,离普通开发者很远。但最近,一个名为“GPT 5.6 Sol”的模型和“vibe coding”的开发方式,正在让这个想法变得触手可及。如果你曾对 3D 可视化、医学教育或…

2026/11/7 22:24:42 阅读更多 →
技术人的“玩乐主义”:从盲盒到开发流程的游戏化设计

技术人的“玩乐主义”:从盲盒到开发流程的游戏化设计

最近在技术圈里,一个看似“不务正业”的话题悄悄火了起来:程序员、架构师们开始在工位上摆弄各种潮玩盲盒,其中一款“初音未来”主题的盲盒更是被戏称为“猛男都无法拒绝的玩乐主义”。这背后仅仅是消费主义吗?还是说,…

2026/11/3 9:27:50 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/6 15:21:35 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/7 12:08:40 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/6 22:01:11 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/6 22:01:11 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/7 12:08:40 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/6 22:01:09 阅读更多 →

日新闻

周新闻

月新闻