发布时间:2026/8/5 11:37:41
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/8/5 11:37:41

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

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

2026/8/5 11:32:41

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

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

2026/8/5 12:32:44

蓟县网站建设怎么做好?从本地化运营到用户体验的全面解析与避坑指南

在这个互联网渗透率极高的时代,几乎没有人能脱离网络生活。对于咱们蓟县的老少爷们儿,还有那些在蓟县打拼的创业者来说,拥有一个属于自己的网站,已经不再是什么遥不可及的高大上概念,而是实实在在的商业刚需。但是,很多人对“蓟县网站建设”这件事存在着深深的误解。有人…

2026/8/5 12:32:44

BilibiliDown音频提取终极指南:5步解锁B站无损音乐资源

BilibiliDown音频提取终极指南:5步解锁B站无损音乐资源 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/…

2026/8/5 12:32:44

【SAP CO】生产订单成本核算和期末结算学习

目录 1 订单计划成本构成 2 订单实际成本构成 凭证流 3 生产成本期末结算 补充 分割结构以及分配的后台配置 SAP中常用的成本核算策略 1 订单计划成本构成 订单计划成本是生产订单在“创建”阶段对“料、工、费”三大成本要素的预先规划,主要计算材料的成本和…

2026/8/5 12:32:43

5步打造完美桌面体验:macOS风格指针主题深度定制指南

5步打造完美桌面体验:macOS风格指针主题深度定制指南 【免费下载链接】apple_cursor Free & Open source macOS Cursors. 项目地址: https://gitcode.com/gh_mirrors/ap/apple_cursor 在桌面美化的世界里,macOS风格指针主题正悄然改变着Windo…

2026/8/5 12:27:43

Dism++:免费高效的Windows系统优化终极指南

Dism:免费高效的Windows系统优化终极指南 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language Dism是一款功能强大的免费Windows系统优化工具&#xff0c…

2026/8/5 3:13:11

如何用免费工具突破游戏窗口限制:SRWE完整使用指南

如何用免费工具突破游戏窗口限制:SRWE完整使用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否遇到过这样的困扰?想为心爱的游戏截图,却发现游戏不支持自定义分辨率…

2026/8/5 0:01:34

三升四,比成绩下滑更可怕的,是孩子开始「认命」

分水岭上,最难的不是翻过去,是孩子不想翻了。八月初了。这两个字,对三升四的家长来说,比任何闹钟都让人清醒。最近的家长群里,气氛明显不一样了。一升二的在关心兴趣班,二升三的在讨论要不要提前学英语。而…

2026/8/5 0:01:34

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:01:34

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/3 22:40:58

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/3 13:26:41

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/3 16:43:13

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…