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);
        }
    }
}
相关推荐
无限进步_19 小时前
【C语言】统计二进制中1的个数:三种方法的比较与分析
c语言·开发语言
失散1320 小时前
分布式专题——23 Kafka日志索引详解
java·分布式·云原生·架构·kafka
西红柿维生素20 小时前
CPU核心数&线程池&设计模式&JUC
java
云虎软件朱总20 小时前
配送跑腿系统:构建高并发、低延迟的同城配送系统架构解析
java·系统架构·uni-app
18538162800余+20 小时前
深入解析:什么是矩阵系统源码搭建定制化开发,支持OEM贴牌
java·服务器·html
李昊哲小课20 小时前
Spring Boot 基础教程
java·大数据·spring boot·后端
code1231320 小时前
tomcat升级操作
java·tomcat
TanYYF20 小时前
HttpServletRequestWrapper详解
java·servlet
Swift社区20 小时前
Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截?
java·spring boot·后端
代码村新手20 小时前
C语言-实用调试技巧
c语言·开发语言