类加载机制------关于主动引用和被动引用

类加载过程

加载->验证->准备->解析->初始化->使用->卸载

类的主动引用(一定会发生类的初始化)

1.new一个对象
2.调用类的静态成员(除了final常量)和静态方法
3.使用java.lang.reflect包的方法对类进行反射调用
4.当虚拟机启动,java Hello,则一定会初始化Hell类,先启动main方法所在的类
5.当初始化一个类,如果父类没有被初始化,则会先初始化它的父类

类的被动引用(不会发生类的初始化)

1.当访问一个静态类时,只有真正声明该静态类的域才会被初始化
2.通过数组定义类的引用,不会触发该类的初始化
3.引用常量不会触发此类的初始化

测试代码如下:





public class Demo01 {
	static{
		System.out.println("静态初始化Demo01");
	}
	
	
	public static void main(String[] args) throws Exception {
		System.out.println("Demo01的main方法!");
		
		
		//主动引用
//		new C();//new一个对象
//		System.out.println(C.width);//调用类的静态成员
//		Class.forName("com.bjsxt.test.C");//使用java.lang.reflect包的方法对类进行反射调用
		
		
		//被动引用
//		System.out.println(C.MAX);//引用常量不会触发此类的初始化
//		C[] as = new C[10];//通过数组定义类的引用,不会触发该类的初始化
		System.out.println(B.width);//当访问一个静态类时,只有真正声明该静态类的域才会被初始化(此处因为width在
									//C中初始化,所以B不会初始化,C初始化)
										
		
	}
}

class B  extends C {
	static {
		System.out.println("静态初始化B");
	}
}

class C extends C_Father {
	public static int width=100;   //静态变量,静态域    field
	public static final  int MAX=100; 
	
	static {
		System.out.println("静态初始化类C");
		width=300;
	}
	public C(){
		System.out.println("创建C类的对象");
	}
}

class C_Father extends Object {
	static {
		System.out.println("静态初始化C_Father");
	}
}

结果如下:

静态初始化Demo01
Demo01的main方法!
静态初始化C_Father
静态初始化类C
300

发布了24 篇原创文章 · 获赞 0 · 访问量 602

猜你喜欢

转载自blog.csdn.net/weixin_43896829/article/details/104535337