Java内部类

内部类

内部类是定义在类内部的类。

Inner Class

在类的内部直接定义一个类就是一个普通的内部类。

java 复制代码
public class InnerClass {
    public static void main(String[] args) {
        Outer outer=new Outer("OuterClass");
        Outer.Inner inner=outer.new Inner();
        inner.func();
    }
}

class Outer {
    private String name;
    Outer(String s) {name=s;}

    class Inner {
        void func(){
            System.out.println("Outer.Inner.func()" + Outer.this.name);
        }
    }
}

从代码中可以看到,要实例化一个内部类,需要先实例化一个外部类对象。在内部类中,可以使用一个特殊的this访问外部类。

Inner Class和普通Class相比,除了能引用Outer实例外,还有一个额外的"特权",就是可以修改Outer Class的private字段,因为Inner Class的作用域在Outer Class内部,所以能访问Outer Class的private字段和方法。

观察Java编译器编译后的.class文件可以发现,Outer类被编译为Outer.class,而Inner类被编译为Outer$Inner.class。

Anonymous Class

还有一种定义内部类的方法,就是在函数中通过匿名类来定义

java 复制代码
public class AnonymousClass {
    public static void main(String[] args) {
        OuterClass outerClass=new OuterClass("OuterClass");
        outerClass.asyncHello();
    }
}

class OuterClass {
    private String name;

    OuterClass(String name) {
        this.name=name;
    }

    void asyncHello() {
        //匿名类实例化一个接口
        Runnable r=new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello, " + OuterClass.this.name);
            }
        };

        new Thread(r).start();
    }
}

匿名类和Inner Class一样,可以访问Outer Class的private字段和方法。之所以我们要定义匿名类,是因为在这里我们通常不关心类名,比直接定义Inner Class可以少写很多代码。

除了接口外,匿名类也完全可以继承自普通类。

Static Nested Class

静态内部类:

java 复制代码
// Static Nested Class
public class Main {
    public static void main(String[] args) {
        Outer.StaticNested sn = new Outer.StaticNested();
        sn.hello();
    }
}

class Outer {
    private static String NAME = "OUTER";

    private String name;

    Outer(String name) {
        this.name = name;
    }

    static class StaticNested {
        void hello() {
            System.out.println("Hello, " + Outer.NAME);
        }
    }
}
相关推荐
二哈赛车手7 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
为何创造硅基生物8 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好8 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~8 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
星寂樱易李8 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
YDS8298 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅9 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆9 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
未若君雅裁10 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
cen__y10 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git