1、什么是静态内部类?

有static修饰,属于外部类本身。

它的特点和使用与普通类是完全一样的,类有的成分它都有,只是位置在别人里面而已。

public class Outer {
    //静态内部类
    public static class Inner {
    }
}


注意:JDK16之前,在成员内部类里面不能定义静态内部类。


2、静态内部类创建对象的格式:

格式:外部类名.内部类名 对象名 = new 外部类.内部类构造器;

范例: Outer.Inner in = new Outer.Inner();

3、静态内部类的访问拓展

静态内部类中是否可以直接访问外部类的静态成员?

可以,外部类的静态成员只有一份,可以被共享访问。

静态内部类中是否可以直接访问外部类的实例成员?

不可以,外部类的实例成员必须要用外部类对象访问。

4、静态内部类的使用场景、特点、访问总结

如果一个类中包含了一个完整的成分,如汽车中的发动机类。

特点、使用与普通类是一样的,类有的成分它都有,只是位置在别人里面而已。

可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。

注意:开发中实际上用的还是比较少。

Java内部类_static declarations in inner classes are not suppo_一位不透露姓名的先生的博客-CSDN博客


What is the output of the following code snippet? 

class A {
    {
        new B();
    }
    static class B {
        {
            new A().new C();
        }
    }
    class C {
        {
            System.out.println("SUCCESS");
        }
    }
}
public class MainClass {
    public static void main(String[] args) {
        new A();
    }
}

A: SUCCESS // 正确

B: Compile error

C: It will throw StackOverflowError

D: None of the above

分析:A类里面定义了静态内部类B,内部类C。类A和C里面声明了代码块,不会执行可以忽略。

静态内部类B定义的代码块并不会自动执行,其中调用new A().new C(),如果执行,递归调用,导致栈溢出:Exception in thread "main" java.lang.StackOverflowError。

如果在main()里面调用new A.B(); 语法正确,同样不会出现栈溢出。

如果改为new C(); 则报语法错误:'com.txw.ms.sample.service.Test.A.this' cannot be referenced from a static context


因为静态方法不能引用非静态成员,包括成员内部类C。

Attachments: