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();
    }
}

运行结果如下:

相关推荐
春日见2 小时前
C++单例模式 (Singleton Pattern)
java·运维·开发语言·驱动开发·算法·docker·单例模式
Remember_9932 小时前
网络原理初识:从基础概念到协议分层
开发语言·网络·php
SamRol2 小时前
达梦数据库指令 及 在Spring Boot + MyBatis-Plus上的使用
java·数据库·spring boot·mybatis·达梦·intellij idea
LOYURU2 小时前
Centos7.6安装Go
开发语言·后端·golang
小二·2 小时前
Go 语言系统编程与云原生开发实战(第1篇):从零搭建你的第一个 Go 服务 —— 理解 GOPATH、Modules 与现代 Go 工作流
开发语言·云原生·golang
星期五不见面2 小时前
嵌入式学习!(一)C++学习-STL(21)-26/1/27
开发语言·c++·学习
大白要努力!2 小时前
Android Spinner自定义背景
java·开发语言
小北方城市网2 小时前
Elasticsearch 分布式检索生产级优化:从索引设计到查询性能
java·大数据·运维·redis·分布式·elasticsearch·搜索引擎
En^_^Joy2 小时前
Kubernetes流量负载:Service与Ingress全解析(K8s)
java·容器·kubernetes