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。
