一、定义

静态内部类是使用 static 关键字修饰的内部类,它属于外部类本身,可以在不依赖外部类实例的情况下被创建和使用。

public class Outer {

    static class Inner {
    
        // 静态内部类的定义
    }
}

二、创建语法

静态内部类的对象创建方式与外部类实例无关,不需要外部类对象即可创建。

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

对比

非静态内部类: Outer.Inner inner = outer.new Inner();

静态内部类: Outer.Inner inner = new Outer.Inner();

三、静态内部类的性质

  1. 静态内部类只能直接访问外部类的静态成员(变量或方法)。

  2. 若要访问外部类的静态成员,必须通过外部类实例

  3. 静态内部类可以包含:

    • 静态成员(字段、方法)
    • 非静态成员(字段、方法)
  4. 静态内部类的静态方法遵守普通静态方法的一切规则:

    • 只能访问静态成员;
    • 无法直接使用 this关键字;
    • 可以通过类名直接调用;
    • 不能访问外部类的非静态内容。
  5. 静态内部类编译后生成的 .class 文件名形如:

    Outer$Inner.class
    

示例

public class Outer {
    private static String staticName = "外部类静态变量";
    private String instanceName = "外部类实例变量";

    // 静态内部类
    static class Inner {
        // 非静态方法
        public void showInfo() {
            System.out.println("访问外部类静态成员:" + staticName);
            
            // 错误写法,不能直接访问非静态成员
            // System.out.println(instanceName);

            // 若要访问外部类的非静态成员必须通过外部类实例:
            Outer outer = new Outer();
            System.out.println("通过外部类对象访问实例成员:" + outer.instanceName);
        }

        // 静态方法
        public static void showStatic() {
            System.out.println("静态方法访问外部类静态成员:" + staticName);
            // 错误写法,不允许访问非静态成员
            // System.out.println(instanceName); 
        }
    }

    // 外部类的main方法用于测试
    public static void main(String[] args) {
        // 创建静态内部类对象(无需外部类实例)
        Outer.Inner inner = new Outer.Inner();
        inner.showInfo();

        // 调用静态内部类的静态方法
        Outer.Inner.showStatic();
    }
}

运行结果:

访问外部类静态成员:外部类静态变量
通过外部类对象访问实例成员:外部类实例变量
静态方法访问外部类静态成员:外部类静态变量
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐