Java内部类

1. 内部类

在Java中有一种类,被定义在一个类的内部,它被称为内部类(Nested Class)。Java中常见的内部类有三种,Inner ClassAnonymous ClassStatic Nested Class



2. Inner Class

有如下代码

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer("Nested"); // 实例化一个Outer
        Outer.Inner inner = outer.new Inner(); // 实例化一个Inner
        inner.hello();
    }
}

class Outer {
    private String name;

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

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

  • 其中Inner类为Outer的内部类,这样的类不能独立于Outer存在,必须由Outer的实例来创建Inner的实例。

  • Inner类可以读写Outer类的private方法和字段。



3. Anonymous Class

Anonymous Class称为匿名类,这种类通常不需要名字,例如:

public class Main {
	public static void main(String[] args) {
        Runnable r = new Runnable() {
            @override
            public void run() {
                System.out.println("Thread run");
            }
        }
        new Thread(r).start();
    }
}

其中Runnable是一个接口,不能使用new来使其实例化,在这儿使用{}定义了一个内部类,该类实现(implement)了Runnable接口,所以Runable就可以引用该匿名类的实例。



4. Static Nested Class

Inner Class类似,唯一不同的是在类的内部定义的是一个静态类,和外部类互相独立,不必像Inner Class那样需要借助Outer的实例进行创建。

public class Main {
    public static void main(String[] args) {
        Outer.Inner inner = Outer.Inner(); // 实例化一个Inner
        inner.hello();
    }
}

class Outer {
    private String name;

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

    static class Inner {
        void hello() {
            System.out.println("Hello, " + Outer.this.name);
        }
    }
}

但与Inner Class相同,可以访问外部类带有private的静态方法和字段。

posted @ 2020-12-24 20:52  Cigar丶  阅读(73)  评论(0编辑  收藏  举报