静态内部类和内部类
-
静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。【主要是因为对于类的静态资源在类加载的时候就被加载进内存中分配空间了,先存在的不能使用后存在的】
-
静态内部类只能访问外部类的静态成员变量和静态方法,而非静态内部类由于持有对外部类的引用(this),可以访问外部类的所用成员
-
对象创建的方式不同
-
静态内部类无需依赖于外部类,它可以独立于外部对象而存在,可以和外部类一样使用 创建方式是注意是new 外部类本身.静态内部类()。
-
内部类创建对象的时候,不能独立于外部类,必须要先创建外部类的对象,然后再用这个对象来new出内部类的对象 创建方式是 是外部类实例.new 内部类()。
✔✔✔静态内部类的加载顺序
- 类加载的过程包括加载,初始化,验证,解析,准备,初始化等五个过程。加载是类加载的一部分。
public class OuterClass { static { System.out.println("加载外部类"); } static class InnerClass{ public InnerClass() {} static { System.out.println("加载内部类"); } static void innerMethod() { System.out.println("内部类的静态方法"); } static int a; } public static void main(String[] args) { OuterClass out=new OuterClass(); System.out.println("============="); // OuterClass.InnerClass.a=1; } }
- 执行以上程序结果为:外部类的静态代码块执行了。
-
- 内部类的静态代码块没有执行在外部类执行静态代码块之后执行,是因为内部类没有加载么?
JVM在加载外部类的过程中,是不会加载静态内部类的,而只有**当内部类的属性和方法被调用时才会被加载,并初始化其静态属性。**且静态属性由于被static修饰,保证只被实例化一次(存放在堆当中)。
因此我们通常利用这一特性实现单例模式
public class Single {
private Single() {}
static class SingleHolder { //这里的创建实在类加载时创建,由JVM保证了其安全性,所以不需要考虑多线程下的安全性
private static final Single instance=new Single();
}
public static Single getinstance() { //只有调用该方法时,才会初始化静态内部类,且只加载一次。
return SingleHolder.instance;
}
}