Java内部类:深入解析四大类型与应用

Java学习之内部类

一、什么是内部类

1、内部类的定义

内部类就是定义在另一个类(外部类)内部的类。你可以把它理解成:外部类是一个 "大房子",内部类是房子里的 "小房间"------ 小房间依赖大房子存在,且能直接访问大房子里的东西(成员变量、方法),而外部类要访问小房间的内容,需要先创建内部类的对象。

2、内部类的核心特点

①、内部类可以直接访问外部类的所有成员(包括 private 修饰的)

②、外部类访问内部类成员,必须先创建内部类的实例

③、内部类会生成独立的字节码文件,命名规则是 外部类名 **内部类名**.class(比如 OuterInner.class)。

二、内部类的分类

1、实例内部类

实例内部类是非静态的成员内部类,它属于外部类的实例(而非外部类本身)------ 你可以理解为:必须先有外部类的 "对象",才能创建实例内部类的对象,就像必须先有 "汽车"(外部类实例),才能有 "发动机"(内部类实例),发动机不能脱离汽车单独存在。

下面我们通过一段代码来向大家介绍内部类

OuterClass类

java 复制代码
public class OuterClass {
    public String name="外部类";
    class Inner{
        public void showOuterName() {
            System.out.println("访问外部类的成员:" + name);
        }
    }
}

TestDemo类

java 复制代码
public class TestDemo {
    public static void main(String[] args) {
        //1、创建外部类实例
        OuterClass outerClass=new OuterClass();
        //2、通过外部类实例创建内部类实例
        OuterClass.Inner inner=outerClass.new Inner();
        inner.showOuterName();
    }
}

运行结果:

2、静态内部类

静态内部类的定义:用 static 修饰的成员内部类,属于外部类本身(而非外部类实例)。

静态内部类的特点::只能访问外部类的静态成员(静态变量、静态方法),创建时不需要外部类实例。

OuterClass类

java 复制代码
public class OuterClass {
    public static  int data1=1;
    private int data2=2;

    static class Inner{
        public static  int data3=3;
        private int data4=4;
        public  void test(){
            System.out.println(data4);
            System.out.println(data3);
            System.out.println(data1);
            //要想打印data2,需要先对外部类进行实例化
            OuterClass outerClass=new OuterClass();
            System.out.println(outerClass.data2);
        }
    }
}

TestDemo类

java 复制代码
public class TestDemo {
    public static void main(String[] args) {
    //静态内部类的调用
        OuterClass.Inner inner=new OuterClass.Inner();//注意调用静态内部类的调用
        inner.test();
    }
}

运行结果如下:

3、匿名内部类

匿名内部类的定义:匿名内部类是 Java 中一种特殊的内部类,它没有类名,通常用于快速创建一个只使用一次的类实例,特别适合简化代码。

匿名内部类的本质:

①、一个没有名字的局部内部类(定义在方法 / 代码块中)

②、必须继承一个父类,或者实现一个接口

③、定义的同时就创建了该类的实例(只能创建一个实例)

④、语法上是一个表达式,因此结尾必须以分号结束

下面我们来举一个匿名内部类的例子,来向大家解释说明匿名内部类的
匿名内部类的第一种调用方法

java 复制代码
class OuterClass{
    public void test(){
        System.out.println("OuterClass::test()");
    }
}
//测试类
public class TestDemo {
    public static void main(String[] args) {
        //第一种调用方法
        OuterClass out= new OuterClass(){
            @Override
            public void test() {
                System.out.println("重写test方法!!");
            }
        };
        out.test();
    }
}


匿名内部类的第二种调用方法

java 复制代码
class OuterClass{
    public void test(){
        System.out.println("OuterClass::test()");
    }
}
public class TestDemo {
    public static void main(String[] args) {
        //第二种调用方法
        new OuterClass(){
            @Override
            public void test() {
                System.out.println("第二种重写test方法!!");
            }
        }.test();
    }

4、局部内部类

局部内部类是定义在方法、代码块(如 for/if 块)或构造方法中的内部类,它的作用域仅限于所在的方法 / 代码块内部,就像方法里的局部变量一样,出了这个范围就无法访问。

下面我们通过举例的方法来向大家讲解局部内部类

OuterClass类

java 复制代码
public class OuterClass {
    // 外部类的成员变量
    private String outerField = "外部类变量";
    // 定义一个方法,局部内部类写在这个方法里
    public void outerMethod() {
        // 方法内的局部变量(有效最终变量)
        String localVar = "方法局部变量";

        // ========== 定义局部内部类 ==========
        class LocalInnerClass { // 这就是局部内部类,仅在outerMethod()内可见
            // 局部内部类的成员变量
            private String innerField = "局部内部类变量";

            // 局部内部类的方法
            public void innerMethod() {
                // 可以访问:外部类成员变量、方法内的局部变量(有效最终变量)
                System.out.println("访问外部类变量:" + outerField);
                System.out.println("访问方法局部变量:" + localVar);
                System.out.println("访问自身变量:" + innerField);
            }
        }
        // ========== 调用局部内部类 ==========
        // 1. 在方法内部创建局部内部类的实例(只能在当前方法内创建)
        LocalInnerClass innerObj = new LocalInnerClass();
        // 2. 调用局部内部类的方法
        innerObj.innerMethod();
    }
}

TestDemo类

java 复制代码
public class TestDemo {
    public static void main(String[] args) {
        // 测试调用
        OuterClass outerObj = new OuterClass();
        outerObj.outerMethod(); // 触发局部内部类的创建和调用
        // ❌ 错误:局部内部类仅在outerMethod()内可见,外部无法访问
        // LocalInnerClass inner = new LocalInnerClass();
    }
}

运行结果如下:

相关推荐
故事还在继续吗4 分钟前
C++20关键特性
开发语言·c++·c++20
青少儿编程课堂41 分钟前
2026青少儿信息素养大赛备赛指南!Python/Scratch/C++备考要点
开发语言·c++·python
ja哇44 分钟前
大厂面试高频八股
java·面试·职场和发展
yoyo_zzm1 小时前
Laravel6.x新特性全解析
java·spring boot·后端
AIFarmer1 小时前
【无标题】
开发语言·c++·算法
Nick_zcy1 小时前
小说在线阅读网站和小说管理系统 · 功能全解析
java·后端·python·springboot·ruoyi
源码宝1 小时前
基于 SpringBoot + Vue 的医院随访系统:技术架构与功能实现
java·vue.js·spring boot·架构·源码·随访系统·随访管理
昇腾CANN1 小时前
TileLang-Ascend 算子性能优化方法与实操
开发语言·javascript·性能优化·昇腾·cann
沐知全栈开发2 小时前
ionic 手势事件详解
开发语言
lsx2024062 小时前
Bootstrap 按钮
开发语言