Java 三大核心机制:抽象类、接口、内部类详解
第一部分抽象类Abstract Class1.1 基本定义使用abstract关键字修饰的类不能被实例化不能 new 对象可以有构造方法供子类调用可以包含成员变量、常量、具体方法、抽象方法1.2 抽象方法使用abstract关键字修饰没有方法体以分号结尾子类必须重写所有抽象方法除非子类也是抽象类1.3 语法要点text修饰符 abstract class 类名 { // 成员变量可以是实例变量或静态变量 // 构造方法供子类调用 // 具体方法有方法体 // 抽象方法只有声明没有方法体 }1.4 代码示例java// 抽象类 abstract class Animal { private String name; // 成员变量 // 构造方法 public Animal(String name) { this.name name; } // 抽象方法子类必须实现 public abstract void makeSound(); // 具体方法子类直接继承 public void sleep() { System.out.println(name is sleeping); } public String getName() { return name; } } // 子类 class Dog extends Animal { public Dog(String name) { super(name); // 调用父类构造 } Override public void makeSound() { System.out.println(getName() says: Woof!); } } // 使用 public class Test { public static void main(String[] args) { Animal dog new Dog(Buddy); dog.makeSound(); // Buddy says: Woof! dog.sleep(); // Buddy is sleeping } }1.5 使用场景多个类有共同的属性和行为需要提取模板部分方法有默认实现部分方法需要子类各自实现表示 is-a 关系例如狗是动物1.6 注意事项抽象类不能与final同时使用final 类不能被继承抽象方法不能是private子类无法重写抽象方法不能是static静态方法不能被重写如果一个类包含抽象方法该类必须是抽象类抽象类可以没有抽象方法但没什么意义第二部分接口Interface2.1 基本定义使用interface关键字定义不能实例化是一种契约/规范定义能做什么支持多实现一个类可以实现多个接口2.2 各版本特性对比JDK版本能包含的内容JDK 7 及以前抽象方法、常量public static finalJDK 8增加默认方法default、静态方法staticJDK 9增加私有方法private2.3 接口中的成员特点常量默认public static final必须初始化抽象方法默认public abstract没有方法体默认方法用default修饰有方法体实现类可选择重写静态方法用static修饰通过接口名.方法名()调用私有方法JDK 9用于接口内部复用代码2.4 语法要点text修饰符 interface 接口名 { // 常量默认 public static final // 抽象方法默认 public abstract // 默认方法default // 静态方法static // 私有方法privateJDK 9 }2.5 代码示例java// 接口1 interface Flyable { // 常量 int MAX_SPEED 100; // 抽象方法 void fly(); // 默认方法 default void land() { System.out.println(Landing...); prepareLanding(); // 调用私有方法 } // 静态方法 static void checkWeather() { System.out.println(Weather is clear); } // 私有方法JDK 9 private void prepareLanding() { System.out.println(Preparing landing gear); } } // 接口2 interface Swimmable { void swim(); } // 实现类多实现 class Duck implements Flyable, Swimmable { Override public void fly() { System.out.println(Duck is flying); } Override public void swim() { System.out.println(Duck is swimming); } // 可选重写默认方法 Override public void land() { System.out.println(Duck lands on water); } } // 使用 public class Test { public static void main(String[] args) { Duck duck new Duck(); duck.fly(); // Duck is flying duck.land(); // Duck lands on water duck.swim(); // Duck is swimming Flyable.checkWeather(); // Weather is clear静态方法 System.out.println(Flyable.MAX_SPEED); // 100 } }2.6 使用场景定义能力/规范例如可飞、可游泳、可排序需要多继承效果类只能单继承接口可以多实现定义回调接口事件监听、线程 Runnable表示 can-do 关系2.7 注意事项接口不能有构造方法接口不能有实例变量只有常量接口的抽象方法不能是private、protected、final、static实现类必须实现所有抽象方法除非实现类是抽象类一个类可以实现多个接口用逗号分隔接口可以多继承接口 extends 多个接口第三部分抽象类 vs 接口核心对比3.1 对比表对比维度抽象类接口JDK 8关键字abstract classinterface能否实例化不能不能继承/实现单继承多实现构造方法有无成员变量可以有实例变量只能有 public static final 常量抽象方法可以有abstract可以有默认 public abstract具体方法可以有可以有default/static访问修饰符任意抽象方法只能是 public设计理念is-a是什么can-do能干什么扩展性新增抽象方法会破坏子类新增 default 方法不影响实现类3.2 如何选择使用抽象类的场景多个类有共同的属性和行为需要定义构造方法需要访问修饰符控制protected、private代码复用性强父子关系明确使用接口的场景需要定义能力/规范需要多继承效果不关心具体实现只关心能做什么后期需要灵活扩展新增 default 方法3.3 口诀text抽象类抽方法、变属性、有构造、单继承 接口 全常量、没构造、多实现、可扩展第四部分内部类Inner Class4.1 分类概览类型位置能否有静态成员访问外部类创建方式成员内部类类内部方法外不能全部成员外部类对象.new静态内部类类内部用 static能仅静态成员new 外部类.内部类()局部内部类方法/代码块内不能全部成员只能在方法内创建匿名内部类方法内new 时不能全部成员new 父类/接口() { }第四部分-1成员内部类非静态内部类定义位置定义在外部类的成员位置与成员变量、成员方法平级没有 static 修饰特点依赖于外部类对象存在可以访问外部类的所有成员包括私有内部类不能有静态成员方法或变量外部类要访问内部类成员需要创建内部类对象代码示例javaclass Outer { private String msg Hello; // 成员内部类 class Inner { public void print() { System.out.println(msg); // 可以访问外部类私有成员 } } // 外部类方法中使用内部类 public void useInner() { Inner inner new Inner(); inner.print(); } } // 使用 public class Test { public static void main(String[] args) { Outer outer new Outer(); // 方式1通过外部类方法 outer.useInner(); // Hello // 方式2直接创建内部类对象 Outer.Inner inner outer.new Inner(); // 语法外部类对象.new 内部类() inner.print(); // Hello } }注意事项创建语法外部类对象.new 内部类()不能在静态方法中直接创建成员内部类需要先有外部类对象内部类中不能定义静态成员第四部分-2静态内部类Static Nested Class定义位置定义在外部类内部使用static修饰特点不依赖外部类对象可以独立创建只能访问外部类的静态成员不能访问非静态成员可以有静态成员变量和方法外部类可以访问静态内部类的私有成员通过对象代码示例javaclass Outer { private static String staticMsg Static; private String nonStaticMsg Non-static; // 静态内部类 static class StaticInner { private static String innerStatic Inner Static; public void print() { System.out.println(staticMsg); // ✅ 可访问外部静态成员 // System.out.println(nonStaticMsg); // ❌ 不能访问外部非静态成员 } public static void staticMethod() { System.out.println(Static method); } } } // 使用 public class Test { public static void main(String[] args) { // 直接创建不需要外部类对象 Outer.StaticInner inner new Outer.StaticInner(); inner.print(); // Static // 调用静态内部类的静态方法 Outer.StaticInner.staticMethod(); // Static method } }注意事项创建语法new 外部类.内部类()类似于顶级类只是被放在外部类内部做逻辑分组不能访问外部类的非静态成员第四部分-3局部内部类Local Inner Class定义位置定义在方法内部或代码块内部作用域仅限于该方法/代码块特点可以访问外部类的所有成员可以访问方法参数和局部变量但这些变量必须是 final 或 effectively final不能使用static修饰只能在定义它的方法内创建和使用代码示例javaclass Outer { private String outerMsg Outer; public void method(final String param) { String localVar Local; // effectively final没有重新赋值 // 局部内部类 class LocalInner { public void display() { System.out.println(outerMsg); // ✅ 访问外部类成员 System.out.println(param); // ✅ 访问方法参数final System.out.println(localVar); // ✅ 访问局部变量effectively final } } // 只能在方法内创建 LocalInner inner new LocalInner(); inner.display(); } } // 使用 public class Test { public static void main(String[] args) { new Outer().method(Hello); } }注意事项JDK 8 之前局部变量必须显式声明finalJDK 8 开始只要变量没有被重新赋值就是 effectively final可以省略final局部内部类不能有静态成员编译后生成外部类名$编号局部内部类名.class第四部分-4匿名内部类Anonymous Inner Class定义位置通常在方法内部作为参数传入或直接赋值特点没有类名一次性使用必须继承一个父类或实现一个接口不能定义构造方法因为没名字可以访问外部类成员和方法内的 final/effectively final 变量常用于事件监听、线程创建、回调代码示例java// 接口 interface Greeting { void sayHello(); } // 普通类 class Person { public void introduce() { System.out.println(I am a person); } } public class Test { public static void main(String[] args) { // 1. 匿名内部类实现接口 Greeting g new Greeting() { Override public void sayHello() { System.out.println(Hello from anonymous); } }; g.sayHello(); // Hello from anonymous // 2. 匿名内部类继承普通类 Person p new Person() { Override public void introduce() { System.out.println(I am anonymous); } }; p.introduce(); // I am anonymous // 3. 典型用法Runnable Thread t new Thread(new Runnable() { Override public void run() { System.out.println(Running in thread); } }); t.start(); // 4. Lambda 简化接口只有一个抽象方法时 Thread t2 new Thread(() - System.out.println(Lambda)); t2.start(); } }注意事项匿名内部类不能定义静态成员匿名内部类不能有构造方法但可以实例化初始化块{}编译后生成外部类名$编号.class如 Test$1.class, Test$2.class如果接口只有一个抽象方法可以用 Lambda 表达式简化Java 8第五部分内部类常见面试题1. 为什么成员内部类能访问外部类的私有成员答案编译器会在成员内部类中隐式持有外部类对象的引用外部类名.this通过这个引用可以访问外部类的所有成员包括私有成员。2. 局部内部类为什么只能访问 final 变量答案因为局部内部类的生命周期可能比方法长例如内部类对象被返回而局部变量存储在栈中方法结束后会被销毁。为了保持一致Java 会将 final 变量的值拷贝到内部类中避免引用失效。3. 静态内部类和成员内部类有什么区别答案静态内部类不持有外部类对象的引用可以独立创建成员内部类必须依赖外部类对象。静态内部类只能访问外部类的静态成员成员内部类可以访问所有成员。4. 匿名内部类有哪些限制答案没有名字、不能有构造方法、不能定义静态成员、不能定义抽象方法除非继承抽象类、只能使用一次。5. 什么时候用内部类答案类只在外部类内部使用封装性需要访问外部类的私有成员逻辑上属于外部类的一部分如 Map.Entry实现回调/事件监听匿名内部类6. 内部类可以继承其他类吗答案可以。内部类和普通类一样可以继承父类、实现接口。第六部分完整记忆口诀text【抽象类】 抽象类不能 new构造方法供继承 抽象方法无 body子类必须全重写 变量方法都可含单继承来定模板 【接口】 接口全常无构造抽象默认静态有 多实现来定义约能力规范它来表 JDK8 加 default灵活扩展不伤旧 【内部类】 成员非静需对象静态独立限静态 局部方法内里藏变量 final 记心上 匿名没有类名字一次使用接口造第七部分快速对比速查表类型能否 new构造方法成员变量抽象方法具体方法继承/实现抽象类❌✅✅任意✅✅单继承接口❌❌仅常量✅✅default/static多实现成员内部类依赖外部类编译器生成✅✅✅可继承/实现静态内部类✅编译器生成✅✅✅可继承/实现局部内部类方法内 only编译器生成✅✅✅可继承/实现匿名内部类一次性❌✅必须实现可重写必须继承/实现

相关新闻

海康威视VisionMaster试用版全功能体验指南

海康威视VisionMaster试用版全功能体验指南

1. 海康VM试用版概述 海康威视VisionMaster(简称VM)是面向机器视觉应用的一站式开发平台,其试用版为开发者提供了30天的全功能体验期。这个工业级视觉处理软件整合了定位、测量、识别、检测四大核心功能模块,支持与海康工业相机、…

2026/10/16 23:28:38 阅读更多 →
WSL2环境下NCL安装配置全攻略:气象数据可视化高效工作流搭建

WSL2环境下NCL安装配置全攻略:气象数据可视化高效工作流搭建

1. 为什么要在WSL里装NCL?一个气象人的真实选择 如果你是一个气象、海洋或者地学领域的研究生或从业者,大概率听说过NCL(NCAR Command Language)。这个由美国国家大气研究中心(NCAR)维护的脚本语言&#xf…

2026/10/16 18:01:03 阅读更多 →
Node.js单线程高并发原理:从内核中断到JS回调的完整技术栈解析

Node.js单线程高并发原理:从内核中断到JS回调的完整技术栈解析

1. 项目概述:为什么单线程能扛住高并发? 每次面试或者和刚接触 Node.js 的朋友聊,总绕不开一个经典问题:“Node.js 是单线程的,那它怎么处理高并发请求?不会卡死吗?” 这问题背后,其…

2026/10/17 8:41:19 阅读更多 →

最新新闻

17节Blender萌系建模课:Q版头像+插画小屋+Lowpoly武器,新手快速入门

17节Blender萌系建模课:Q版头像+插画小屋+Lowpoly武器,新手快速入门

资源概述 这是一套围绕Blender 3D建模的系列教程,以萌系角色与场景设计为主线,通过自媒体渠道分享。资源整体为压缩包形式,内含17个视频章节以及一个名为“课程素材.exe”的配套素材包。教程从零基础宣传片引入,逐步展开各主题项…

2026/10/18 22:20:36 阅读更多 →
从调通API到构建AI Agent:Python实战物流调度助手全解析

从调通API到构建AI Agent:Python实战物流调度助手全解析

两个多月前,有位读者给我留言:“我已经能把大模型API调通了,但总觉得自己写的是聊天机器人,离AI Agent还差着十万八千里,到底差在哪?”这个问题最近被问得特别频繁,所以我决定用一整篇文章把它讲…

2026/10/18 22:20:36 阅读更多 →
BrowserSkill:基于CDP协议的浏览器CLI自动化工具

BrowserSkill:基于CDP协议的浏览器CLI自动化工具

1. 项目概述:BrowserSkill不是插件,而是一套浏览器自动化能力的CLI封装体系BrowserSkill这个名字乍一听像某个Chrome扩展,但实际它完全不依赖浏览器界面、不走WebExtensions API、也不需要用户手动点击安装。我第一次在GitHub上看到这个仓库时…

2026/10/18 22:20:36 阅读更多 →
Claude Code 三个月实战:命令行 AI 编程的高效工作流指南

Claude Code 三个月实战:命令行 AI 编程的高效工作流指南

三个月前我第一次在终端里敲下claude这个命令时,根本没想到会被同一个工具折磨这么久,也从没想过它真能改变我的工作方式。如果你还不了解 Claude Code,一句话解释:它不是又一个能和你聊天的 AI 网页版,而是把 Claude …

2026/10/18 22:20:36 阅读更多 →
Flutter Slider自定义形状:用Shape实现菱形/宝石滑块

Flutter Slider自定义形状:用Shape实现菱形/宝石滑块

如果你接手过一个“把滑块改成菱形”的需求,大概率和我一开始一样,先找找有没有thumbColor、borderRadius之类的参数,结果发现无论怎么调,滑块始终是那个标准的圆。我前几个月在一个画板类项目里就遇到过这种事:UI 给的…

2026/10/18 22:20:36 阅读更多 →
同一篇论文AIGC检测各章AI率差很多:分段差异成因与逐章应对

同一篇论文AIGC检测各章AI率差很多:分段差异成因与逐章应对

一份AIGC检测报告摊开,有人看到摘要标红、材料方法却干净,也有人恰好相反——讨论章被标红,综述段落反而安静。同一份稿子,各章读数为何对不上?下面从章节写作惯例讲起,先说差异从哪来,再按章节…

2026/10/18 22:19:35 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →