Java 面向对象核心概念一锅端:接口、继承、多态、转型(附完整代码)

发布时间:2026/9/22 0:22:10

Java 面向对象核心概念一锅端:接口、继承、多态、转型(附完整代码) 前言面向对象的三大特性——封装、继承、多态是每个Java开发者绕不开的基础。但我们如果只看理论很容易一看就会一写就废。今天我打算用一个学生-老师的场景把这几个核心概念串起来讲清楚。我们先简单看一下今天各个主角的定义接口Interface——定义规范继承Extends——复用代码方法重写Override——子类改造父类行为向上转型 / 向下转型——类型的转换规则多态Polymorphism——同一个调用不同行为一、接口只定规范不写实现public interface IStudent { // 常量 // 等价于 public static final String NAME 杨某人; // static → 类变量内存中只有一份所有实现类共享 // final → 不可修改赋值后永远是这个值 // 接口中不写修饰符编译器也会自动补上这三样 String NAME 杨某人; // 抽象方法 // 等价于 public abstract void study(); // 没有方法体 { }直接以分号结尾 // 谁实现这个接口谁就必须补上方法体 void study(); }接口是什么 我们可以打个形象的比方接口就是一份合同或规范。它只规定你必须会什么但不关心你怎么做到。就像现实中的学生这个概念只要是学生就必须会学习。但小学生学习和大学生学习的方式完全不同——接口只管你得有study() 这个方法具体怎么学由各个实现类自己决定。接口中的常量String NAME 杨某人看起来只是一个普通变量但编译器会自动给它加上 public static final三个修饰符static → 属于接口本身不依赖任何对象全局只有一份final → 不可修改赋值一次后永远不变接口不能 newnew IStudent() 会直接编译报错。因为接口只有方法声明没有方法体new 出来也没法用。二、实现类给接口的方法填身体public class Student implements IStudent { // 属性 private int score; // 私有属性子类继承但不可直接访问 // 构造方法 // 无参构造 — 子类默认调用这个 // 实际上这里隐含了 super()即调用 Object 类的构造方法 public Student() { System.out.println( [Student 无参构造] 创建了一个普通学生对象); } // 有参构造 public Student(int score) { this.score score; System.out.println( [Student 有参构造] 创建学生学分 score); } // getter / setter // 私有属性 score 只能通过这些公开方法访问 public void setScore(int score) { this.score score; } public int getScore() { return score; } // 实现接口中的抽象方法必须实现 // 这是对接口 study() 的第一次填身体 Override public void study() { System.out.println(NAME 正在学习来自 Student 的实现); } }implements 关键字的含义我Student 类承诺实现 IStudent 接口规定的所有方法。如果少实现一个编译器直接报错。封装体现在哪里score 属性用 private 修饰外部不能直接 obj.score 这样访问必须通过 getScore() / setScore()方法。这就是封装——数据藏起来通过方法控制访问。Override注解告诉编译器我是重写接口/父类的方法不是新方法。加了这个注解后如果你不小心把方法名写错了比如写成stdudy()编译器会立刻报错——帮你避免低级错误。三、继承子类拿到父类的全部还能加自己的public class UNStudent extends Student { // 构造方法 // 无参构造 public UNStudent() { // 这里隐式调用了 super() → Student 的无参构造 // 然后再调用 Object 的无参构造 // 调用链UNStudent() → Student() → Object() System.out.println( [UNStudent 无参构造] 创建了一个大学生对象); } public UNStudent(int score) { super(score); // 显式调用父类 Student 的有参构造 System.out.println( [UNStudent 有参构造] 创建大学生学分 score); } // 子类特有方法 // 这个方法父类没有只有 UNStudent 有 // —— 用于演示向下转型 public void print() { // getScore() 是父类的 public 方法子类可以直接用 // 但如果直接写 score就报错了score 是 private 的 System.out.println(学分 getScore()); } // 方法重写Override // 重写条件 // ① 有继承关系UNStudent extends Student // ② 方法名、参数、返回值类型完全一致 // ③ 访问权限不能比父类更严格 Override public void study() { // 调用父类的 study()保留父类原有功能 super.study(); // 在父类基础上新增子类独有的功能 System.out.println( 然后——大学生去图书馆深入自习UNStudent 新增的功能); } }构造方法链——先父后子创建 new UNStudent(89) 时构造方法调用顺序是Object() → Student(score) → UNStudent(score)就像建房子先打好地基Object再盖一楼Student最后盖二楼UNStudent。每层都在上一层的基础上建造。super.study() 的精髓很多人写重写时直接覆盖父类方法把父类的逻辑全丢了。更好的做法是先用 super.study()保留父类已有的功能再在后面加上子类独有的逻辑。就像大学生学习——普通学生的学习内容上课听讲仍然要做只是额外增加了去图书馆自习。方法重写的三个条件1. 有继承关系UNStudent extends Student2. 方法名、参数、返回值类型完全一致3. 访问权限不能比父类更严格父类是 public子类不能改成 private四、转型类型的升职与降职向上转型自动Student s1 new UNStudent(93); //子类对象赋值给父类引用自动发生 s1.study(); // 执行的是 UNStudent 重写后的版本 // s1.print(); // 编译错误s1 的类型是 Student没有 print() 方法向上转型就像大学生UNStudent当然可以被称为学生Student这是天经地义的不需要任何强制手段——编译器自动处理。但代价是视野变窄s1 的类型声明是 Student所以只能调用 Student 类中定义过的方法。UNStudent 独有的 print()方法虽然对象里有但编译器看不到——因为编译器只看声明类型不看实际类型。向下转型强制UNStudent un2 (UNStudent) s1; // 强制转型前提s1 本质上就是 UNStudent un2.print(); // 现在可以调用 UNStudent 特有的 print()方法了向下转型就像这个学生身份s1你得确认他真的就是大学生才能恢复他大学生的身份。危险如果对象本质上不是那个类型强转会抛 ClassCastExceptionStudent s2 new Student(); UNStudent un3 (UNStudent) s2; // 运行时报错s2 本质不是 UNStudent就像你不能把一个普通学生强行说成是大学生——他没有大学生的特有属性和行为。五、多态同一个方法千姿百态public void teach(Student s) { System.out.print(老师开始教 → ); s.study(); //运行时多态实际调用哪个 study()取决于 s 的真实类型 } /** * 教学接口版更进一步只认 IStudent 规范 * 连是不是 Student 类都不管了——只要你实现了 IStudent 接口我就能教 */ public void teachByInterface(IStudent s) { System.out.print(老师按接口开始教 → ); s.study(); } }测试代码Teacher t new Teacher(); // 同一个 teach 方法传入不同类型的对象 t.teach(new Student(91)); // 输出Student 版本的 study() t.teach(new UNStudent(95)); // 输出UNStudent 版本的 study()加了图书馆自习多态的核心teach() 方法的参数类型是Student但它不关心你传进来的是普通学生还是大学生——只要你是个学生我就能教。至于具体怎么学习study()执行哪个版本由运行时对象的真实类型决定。这种同一个方法调用不同对象产生不同行为的机制就是多态。多态的好处将来新增一个 HighSchoolStudent extends StudentTeacher.teach() 一行代码都不用改——直接传进去就能教。这就是对扩展开放对修改关闭。六、完整测试类public class Test { public static void main(String[] args) { // 【1】接口常量 System.out.println(接口常量 IStudent.NAME IStudent.NAME); // 【2】构造方法链 Student stu1 new Student(86); stu1.study(); UNStudent un1 new UNStudent(89); // 构造链Object → Student → UNStudent先父后子 un1.study(); // 输出父类版本 子类新增内容 // 【3】向上转型 Student s1 new UNStudent(93); // 自动转型 s1.study(); // 运行时执行 UNStudent 版本 // 【4】向下转型 UNStudent un2 (UNStudent) s1; // 强制转型 un2.print(); // 恢复子类特有方法的访问 // 【5】多态 Teacher t new Teacher(); t.teach(new Student(91)); // Student 版本 t.teach(new UNStudent(95)); // UNStudent 版本 // 【6】接口引用 IStudent is1 new Student(); IStudent is2 new UNStudent(); t.teachByInterface(is1); // 只认接口不关心具体类 t.teachByInterface(is2); } } }七总结我说句实话这个学生-老师类是我觉得最好上手写的代码。当然我相信没人能否定无论是你听了一节课或者说看了一篇文章你还是得亲自去写代码你才能真正弄懂每个知识点。所以我希望看完这篇文章的朋友快快去写代码吧在写代码的过程中真的你会有许多新的体验和想法所以这就是我们CS的学生一直强调的代码量的问题哪怕现在是AIAgent时代。建议第一遍可以照着写后面大家可以自己创建不同的类按自己的想法写
延伸阅读

更多相关文章

2026/9/21 14:23:49

OpenClaw工具链与飞书集成部署指南

1. OpenClaw 工具链全景解析 OpenClaw作为新一代企业级自动化集成平台,其核心价值在于打通了AI能力与办公协同系统的最后一公里。这套工具链由三个关键组件构成:本地化部署的智能代理服务(OpenClaw Core)、企业通讯平台适配器&…

2026/9/20 0:33:29

gstack实战:23个AI技能与7步工作流,实现一人成军式开发

1. 项目概述:当“一人成军”从口号变为现实 “一个人就是一个团队”,这句话在技术圈流传已久,但过去更多是一种对个人能力极限的赞美。直到最近,随着一系列AI工具链的成熟,这句话开始从一个理想化的口号,变…

2026/9/22 0:19:53

访问限制密码能找回嘛原理详解

搞定访问限制密码找回的3个实战技巧含性能优化 看了一堆教程还是不会写项目?别急,今天直接上代码。 很多后端开发在搭建用户系统时,都遇到过 访问限制密码能找回嘛 这个痛点。 其实核心逻辑很简单,但涉及 性能优化 和安全性时,细节魔鬼多。…

2026/9/22 0:19:53

用什么理由请假最真实踩坑实录

3个真实理由搞定请假:从API变更到性能优化的实战 版本升级后 API 全变了,这是很多开发者半夜改代码时最头疼的瞬间。你盯着屏幕,发现旧文档里的方法全标了废弃,新接口参数复杂得像天书,心里只剩一个念头:怎么跟老板请假去查资料,还要显得特别…

2026/9/22 0:19:53

大学校园潜在的商机:3种校园接单方案性能优化实战

大学校园潜在的商机:3种校园接单方案性能优化实战 看了一堆教程还是不会写项目?别急,问题不在你笨,而在你只学了语法没学场景。今天拆解【大学校园潜在的商机】,用代码说话,讲透【性能优化】怎么落地。 方案一:Python…

2026/9/22 0:19:53

ie浏览器手机版性能优化实战:3个坑让你提速50%

ie浏览器手机版性能优化实战:3个坑让你提速50% 面试被问原理答不上来,简历上写着精通性能优化,代码却跑不动?别急,今天咱们不聊虚的,直接拆解一个被无数人忽略的痛点: ie浏览器手机版…

2026/9/22 0:19:53

大学生新颖的调查问卷入门到精通:从零搭建实战项目

大学生新颖的调查问卷入门到精通:从零搭建实战项目 看了一堆教程还是不会写项目?这是大多数初学者最大的痛。别急,今天我们直接上手,通过【大学生新颖的调查问卷】这个实战案例,带你走完【入门到精通】的全流程。 项目目标与需求拆解…

2026/9/22 0:14:50

怎样记住英语单词的底层逻辑与新手避坑指南

怎样记住英语单词的底层逻辑与新手避坑指南 满屏红字报错,StackTrace 长到拉不完,新手避坑的第一步其实是看懂它。 很多人觉得英语单词是语文问题,但在编程圈,它往往意味着你连基本的错误日志都读不懂。当…

2026/9/21 3:28:31

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/21 3:33:19

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/22 0:04:49

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点

输电线路在线监测高频面试题拆解 3秒抓住官方文档重点 官方文档几百页翻到头还是懵?面试问到 输电线路在线监测 的数据链路时,脑子一片空白?别慌,这种 高频面试题 我整理了10年,专门治各种“文档太长抓不住重点”的毛病。…

2026/9/22 0:04:49

中介房源管理系统重构避坑:3个关键步骤搞定API变更

中介房源管理系统重构避坑:3个关键步骤搞定API变更 版本升级后 API 全变了,这种痛只有真做过的人懂。 很多团队在接手老旧房产项目时,最崩溃的不是代码烂,而是底层框架升级后,原本熟悉的接口调用方式彻底失效。 这份 保姆级教程…

2026/9/22 0:04:49

3个坑点带你一文搞懂55gg小游戏源码

3个坑点带你一文搞懂55gg小游戏源码 盯着控制台满屏的红色报错,看着那一长串 StackTrace ,是不是脑子瞬间宕机?别急,这种时候最忌讳的就是盲目改代码。很多刚入行的前端同学,面对 55gg 小游戏这类轻量级 H5…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/21 18:32:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/21 10:29:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码