计算机学习笔记 从封装、继承到多态与抽象类全景解析(附带详细代码示例)
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/10/7 8:46:00 阅读更多 →
AI驱动3D可视化开发:零基础构建交互式人体解剖应用

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

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

2026/10/13 13:36:10 阅读更多 →
技术人的“玩乐主义”:从盲盒到开发流程的游戏化设计

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

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

2026/10/3 14:01:20 阅读更多 →

最新新闻

免费 Win11 与 Office 激活指南:MAS 脚本 4 种方式一键完成

免费 Win11 与 Office 激活指南:MAS 脚本 4 种方式一键完成

免费 Win11 与 Office 激活指南:MAS 脚本 4 种方式一键完成 【免费下载链接】Microsoft-Activation-Scripts Open-source Windows and Office activator featuring HWID, Ohook, TSforge, and Online KMS activation methods, along with advanced troubleshooting.…

2026/10/14 3:07:32 阅读更多 →
仓颉语言 Decimal 基本属性详解:sign / scale / value / precision 实战指南

仓颉语言 Decimal 基本属性详解:sign / scale / value / precision 实战指南

文档知识库教程OpenHarmony 【免费下载链接】CangjieCorpus 本仓库为仓颉编程语言语料库,聚焦 仓颉编程语言 核心知识体系,整合官方开发指南、API 文档、典型代码示例及语法规范等多维度资源,经结构化处理与专业标注,构建为支持 R…

2026/10/14 3:07:32 阅读更多 →
Wing 云服务(cloud.Service)在模拟器中的令牌(Token)绑定与端到端测试

Wing 云服务(cloud.Service)在模拟器中的令牌(Token)绑定与端到端测试

编程语言编译器云原生语言运行时 【免费下载链接】wing A programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡ 项目地址: https://gitcode.com/gh_mirrors/wi/wing 点击查看 免…

2026/10/14 3:07:32 阅读更多 →
大模型之LangGraph多轮对话记忆

大模型之LangGraph多轮对话记忆

用 LangGraph 的 Reducer,轻松搞定多轮对话记忆 做聊天机器人最头疼的是什么?是记不住上文。今天分享一个 LangGraph 的小技巧:用 Reducer 机制优雅地管理对话历史。 核心只有一行代码: messages: Annotated[Sequence[AnyMessa…

2026/10/14 3:07:32 阅读更多 →
免费三步:老 Mac 升级最新 macOS

免费三步:老 Mac 升级最新 macOS

免费三步:老 Mac 升级最新 macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 一台 2015 年的 MacBook Pro,App Store 早就不给推送…

2026/10/14 3:07:32 阅读更多 →
PySide2工具栏与状态栏实战:QToolBar和QStatusBar高效开发指南

PySide2工具栏与状态栏实战:QToolBar和QStatusBar高效开发指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 3:06:32 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →