news 2026/4/5 20:03:53

【Java +AI |基础篇day7 抽象类 + 接口 + 代码块 + 内部类】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java +AI |基础篇day7 抽象类 + 接口 + 代码块 + 内部类】

Java 面向对象编程(OOP)进阶篇②:抽象类 + 接口 + 代码块 + 内部类

(初学者友好 + 可运行代码 + 面试题详解)

前言

初学 Java 抽象类和接口时,我分不清 “什么时候用抽象类、什么时候用接口”,被代码块的执行顺序、内部类的创建方式绕得晕头转向,面试时对抽象类与接口的核心区别答不到点上 —— 抽象类是 “不完整的模板”,接口是 “行为的规范”,代码块和内部类是类的特殊成分,掌握这些才能真正灵活设计 Java 程序。这篇内容把抽象类、接口、代码块、内部类的核心概念、语法要素和高频面试题拆解清楚,所有代码极简可运行,帮新手吃透这些 OOP 核心知识点。

一、核心思路 / 概念(大白话讲透)
  1. 抽象类:核心是「半成品模板」—— 包含抽象方法(只有声明没有实现)和普通方法,不能创建对象,强制子类实现抽象方法,适合抽取类的共性(属性 + 方法)。
  2. 接口:核心是「行为规范书」—— 只定义行为的标准(方法签名),不关心实现,支持多实现,适合抽取类的共性行为。
  3. 代码块:核心是「初始化工具」—— 静态代码块初始化类(仅一次),实例代码块初始化对象(每次创建都执行),解决构造器重复逻辑问题。
  4. 内部类:核心是「类的内部组件」—— 定义在其他类内部的类,用于封装与外部类强关联的逻辑,分成员、静态、局部、匿名四种。
二、实操步骤 + 可运行代码
2.1 抽象类(不完整的类)
2.1.1 基础语法(直接运行)

java

运行

// 抽象类:不能创建对象 abstract class Animal { String name; // 抽象方法:无方法体,子类必须实现 public abstract void cry(); // 普通方法:可继承 public void eat() { System.out.println(name + "吃饭"); } } // 子类:必须实现所有抽象方法 class Cat extends Animal { @Override public void cry() { System.out.println(name + "喵喵叫"); } } public class AbstractDemo { public static void main(String[] args) { Animal a = new Cat(); a.name = "小花"; a.cry(); // 输出:小花喵喵叫 a.eat(); // 输出:小花吃饭 } }
2.1.2 模板方法设计模式(核心应用)

java

运行

// 抽象类:封装固定流程 abstract class Exam { // 模板方法:final禁止重写 public final void examProcess() { System.out.println("1. 发试卷"); doExam(); // 可变步骤(抽象方法) System.out.println("3. 收试卷"); } public abstract void doExam(); } // 子类实现可变步骤 class StudentA extends Exam { @Override public void doExam() { System.out.println("2. 学生A认真做题"); } } public class TemplateDemo { public static void main(String[] args) { Exam a = new StudentA(); a.examProcess(); // 输出:1.发试卷 → 2.学生A认真做题 → 3.收试卷 } }
2.2 接口(行为规范)
2.2.1 基础语法 + JDK8 新特性(直接运行)

java

运行

// 接口:行为规范 interface Swim { // 抽象方法(默认public abstract) void swim(); // 默认方法(有方法体,可重写) default void warmUp() { System.out.println("热身运动"); } // 静态方法(接口名调用) static void showRule() { System.out.println("禁止潜水"); } } // 实现接口 class Fish implements Swim { @Override public void swim() { System.out.println("鱼游"); } } public class InterfaceDemo { public static void main(String[] args) { Fish f = new Fish(); f.warmUp(); // 输出:热身运动 f.swim(); // 输出:鱼游 Swim.showRule(); // 输出:禁止潜水 } }
2.2.2 接口多实现(弥补单继承)

java

运行

interface Run { void run(); } interface Fly { void fly(); } // 实现多个接口 class Bird implements Run, Fly { @Override public void run() { System.out.println("鸟跑"); } @Override public void fly() { System.out.println("鸟飞"); } }
2.3 代码块(初始化工具)

java

运行

class BlockDemo { // 静态代码块:类加载时执行(仅一次) static { System.out.println("静态代码块1"); } static { System.out.println("静态代码块2"); } // 实例代码块:创建对象时执行(构造器前) { System.out.println("实例代码块1"); } { System.out.println("实例代码块2"); } public BlockDemo() { System.out.println("构造器"); } } public class BlockTest { public static void main(String[] args) { new BlockDemo(); // 输出:静态1→静态2→实例1→实例2→构造器 new BlockDemo(); // 输出:实例1→实例2→构造器(静态代码块不重复执行) } }
2.4 内部类(类的内部组件)
2.4.1 成员内部类(直接运行)

java

运行

class Outer { private String outerName = "外部类"; // 成员内部类:依赖外部类实例 class Inner { private String innerName = "内部类"; public void show() { // 直接访问外部类私有成员 System.out.println(outerName + " + " + innerName); } } public void accessInner() { Inner inner = new Inner(); System.out.println(inner.innerName); } } public class InnerClassDemo { public static void main(String[] args) { // 创建内部类对象:外部类实例.new 内部类() Outer.Inner inner = new Outer().new Inner(); inner.show(); // 输出:外部类 + 内部类 } }
2.4.2 匿名内部类(核心应用)

java

运行

interface Swim { void swim(); } public class AnonymousDemo { public static void main(String[] args) { // 匿名内部类:快速创建接口实现类对象 Swim s = new Swim() { @Override public void swim() { System.out.println("匿名内部类实现游泳"); } }; s.swim(); // 输出:匿名内部类实现游泳 } }
三、高频面试题详解
面试题 1:抽象类 vs 接口

问题:设计支付功能(微信 / 支付宝 / 银联),都有 “发起支付”“查询状态”,且有固定 “安全校验” 流程,该用抽象类还是接口?为什么?解答

  • 用「抽象类」实现:
    1. 抽象类封装固定流程(安全校验)和通用属性(支付名称);
    2. 抽象方法定义 “发起支付”“查询状态”(子类个性化实现);
  • 核心区别:
    维度抽象类接口
    继承关系单继承多实现 / 多继承
    成员类型抽象 / 普通方法、变量抽象 / 默认 / 静态方法、常量
    设计理念is-a(子类是父类的一种)has-a(类具备某种行为)
面试题 2:代码块执行顺序

问题:父类 + 子类的代码块执行顺序?解答:父类静态代码块 → 子类静态代码块 → 父类实例代码块 → 父类构造器 → 子类实例代码块 → 子类构造器。

四、总结
  1. 抽象类核心:不能创建对象,子类必须实现所有抽象方法,适合封装固定流程(模板方法模式);
  2. 接口核心:JDK8+ 支持默认 / 静态方法,多实现弥补单继承,适合定义行为规范;
  3. 代码块核心:静态代码块初始化类(仅一次),实例代码块初始化对象(每次创建都执行);
  4. 内部类核心:成员内部类依赖外部类实例,匿名内部类简化接口 / 父类的一次性实现。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/14 2:52:38

基于python的大学校友录信息管理系统[python]-计算机毕业设计源码+LW文档

摘要:大学校友是学校宝贵的资源,校友录信息管理系统对于加强校友之间以及校友与母校之间的联系具有重要意义。本文基于Python语言,设计并实现了一个功能较为完备的大学校友录信息管理系统。系统涵盖了系统用户管理、新闻数据管理、班级管理、…

作者头像 李华
网站建设 2026/4/5 6:18:53

4-8层小尺寸PCB厚度不对称翘曲控制

4–8 层小尺寸 PCB 是当前微型电子产品的主流选型,厚度不对称性翘曲,是这类产品量产阶段的核心工艺痛点。小尺寸 PCB 板幅小、层数多、超薄化,各层材料厚度、铜面分布、树脂含量的细微差异,都会在层压后引发明显的翘曲变形。作为 …

作者头像 李华
网站建设 2026/4/2 4:02:11

MSCMCCHS.DLL文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/3/31 16:25:16

Linux驱动开发完全指南:驱动种类、修改时机与实战解析

Linux驱动开发完全指南:驱动种类、修改时机与实战解析 一、Linux驱动全景图:驱动分类详解 Linux内核驱动按照硬件类型可分为以下几大类: #mermaid-svg-b2mfzc01vv2bWPRG{font-family:"trebuchet ms",verdana,arial,sans-serif;fo…

作者头像 李华
网站建设 2026/3/13 20:49:35

【网络安全】一个漏洞2w+,网安副业挖SRC漏洞,站着把钱挣了!

【网络安全】一个漏洞2w,网安副业挖SRC漏洞,站着把钱挣了! 前言 一个漏洞奖励2w,这是真实的嘛! UP入行网安这些年也一直在接私活,副业赚的钱几乎是我工资的三倍!看到最近副业挖漏洞的内容非常…

作者头像 李华