教程中心 / Java教程 / 内部类

内部类

12分钟 面向对象

内部类概述

内部类(Inner Class)是定义在另一个类内部的类,可以访问外部类的所有成员,包括私有成员。

成员内部类

 public class Outer {
    private String outerVar = "外部变量";

    public class Inner {
        private String innerVar = "内部变量";

        public void show() {
            System.out.println(outerVar);
            System.out.println(innerVar);
        }
    }

    public Inner getInner() {
        return new Inner();
    }
}

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.show(); 

静态内部类

 public class Outer {
    private static String staticVar = "静态变量";

    public static class StaticInner {
        public void show() {
            System.out.println(staticVar);
        }
    }
}

Outer.StaticInner si = new Outer.StaticInner();
si.show(); 

局部内部类

 public class Outer {
    public Object createCalculator() {
        final int base = 10;

        class Calculator implements Runnable {
            public int add(int a, int b) {
                return a + b + base;
            }

            public void run() {
                System.out.println("Calculator running");
            }
        }

        return new Calculator();
    }
} 

匿名内部类

 public class AnonymousDemo {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                System.out.println("匿名内部类运行");
            }
        };
        r.run();

        Thread t = new Thread(new Runnable() {
            public void run() {
                System.out.println("线程中使用匿名内部类");
            }
        });
        t.start();
    }
} 

内部类分类对比

类型修饰符访问外部成员创建方式
成员内部类无/static全部outer.new Inner()
静态内部类static仅静态new Outer.Inner()
局部内部类全部方法内new
匿名内部类全部new Xxx(){}

小结

  • 内部类可以访问外部类的所有成员
  • 成员内部类依赖于外部类实例
  • 静态内部类不依赖外部类实例
  • 匿名内部类没有名字,用于简化代码
☕ Java 在线代码编辑器
📝 运行结果