内部类

inner class

定义在另一个类中的类

分类

  • 成员内部类(静态、非静态)
    • 格式: 外部类 $ 内部类名.class e.g. OuterClass$NonStaticInnerClass.class OuterClass$NonStaticInnerClass.class
  • 局部内部类(方法内、代码块内、构造器内)
    • 格式: 外部类 $ 数字 内部类名.class e.g.OuterClass$1PartInnerClass.class

成员内部类

  • 作为外部类的成员
    • 调用外部类的结构
    • 可以被 static 修饰
    • 可以被 4 种不同的权限修饰
  • 作为一个类
    • 类内可以定义属性、方法、构造器等
    • 可以被 final 修饰,表示此类不能被继承。不使用 final,就可以被继承
    • 可以被 abstract 修饰

局部内部类

局部内部类的方法中如果调用内部类所声明的方法中的局部变量的话,要求此局部变量声明为 final 的。

Demo

OuterClass.java

package com.hua.demo;

public class OuterClass {
    String name = "OuterClass";

    private void show() {
        System.out.println(this.name);
    }

    public static class StaticInnerClass {
    }

    public class NonStaticInnerClass {
        String name = "NonStaticInnerClass";

        public void show(String name) {
            System.out.println(name); // 形参
            System.out.println(this.name); // 内部类属性
            System.out.println(OuterClass.this.name); // 外部类属性
            OuterClass.this.show(); // 外部类的方法
        }
    }

    public SomeInterface getPartInnerClass() {
        class PartInnerClass implements SomeInterface {
        }
        return new PartInnerClass();
    }

    public void showPartInnerClass() {
        int a = 1;
        class PartInnerClass {

            public void showPartAttr() {
//                a += 1;
                // variable should be final
                System.out.println(a);
            }
        }
        PartInnerClass partInnerClass = new PartInnerClass();
        partInnerClass.showPartAttr();
    }
}

interface SomeInterface {
}


InnerClassTest.java

package com.hua.demo;

import org.junit.Test;

public class InnerClassTest {

    @Test
    public void test() {
        // 创建静态内部类实例
        OuterClass.StaticInnerClass staticInnerClass = new OuterClass.StaticInnerClass();
        System.out.println(staticInnerClass);

        // 创建非静态内部类实例
        OuterClass outerClass = new OuterClass();
        OuterClass.NonStaticInnerClass nonStaticInnerClass = outerClass.new NonStaticInnerClass();
        System.out.println(nonStaticInnerClass);
        nonStaticInnerClass.show("Harvey");
        outerClass.showPartInnerClass();

        System.out.println(outerClass.getPartInnerClass());
    }
}