Java类加载过程知识点总结

1java执行时是动态加载class的,不是一次性加载完。

 

2classloader的分层:

最上一层是bootclassLoader,然后是扩展(Extesion classloader)、应用(Application classLoader,用户自定义的class)、其他loader

注意:classLoaderload class的时候首先找上一层的loader是不是load过了,如果已经load了,就不会再次load

作用: 安全性好!比如:自己写的String.class永远也没机会执行到,只会执行系统的String.class

 

classloader举例程序:

public class TestClassLoader {

	/**
	 * 演示classloader的知识点
	 * @author cdzhujun
	 */
	public static void main(String[] args) {
		//classloader的分类
		//注:BootStrap ClassLoader没有name
		System.out.println(String.class.getClassLoader());
		System.out.println(com.sun.crypto.provider.DESedeKeyFactory.class.getClassLoader().getClass().getName());
		System.out.println(TestClassLoader.class.getClassLoader().getClass().getName());
		
		
		System.out.println("——————");
		/*
		 * classLoader在load class的时候首先找上一层的loader是不是load过了,如果已经load了,就不会再次load
		 * 作用:安全性好!比如:自己写的String.class永远也没机会执行到,只会执行系统的String.class
		 */
		ClassLoader c = TestClassLoader.class.getClassLoader();
		//打印出父classloader
		while(c != null) {
			System.out.println(c);
			c = c.getParent();
		}
	}
}

 执行结果:

null
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$AppClassLoader
——————
sun.misc.Launcher$AppClassLoader@7e820d53
sun.misc.Launcher$ExtClassLoader@c390508

 3、静态语句块:在加载后执行一次。

型如:

static {
		System.out.println("这是静态语句块");
}

 4、动态语句块:每次new新的对象都会执行

型如:

{
		System.out.println("这是动态语句块");
}

 5、对象的初始化顺序: 静态代码块内容先执行,接着执行父动态代码块和构造方法,然后执行子类动态代码块和构造方法。

例子程序:

class ParentTest {
	public static String PARENT_STATIC_FIELD = "父类-静态属性";

	// 父类-静态块
	static {
		System.out.println(PARENT_STATIC_FIELD);
		System.out.println("父类-静态代码块");
	}

	public static String parentField = "父类-非静态属性";

	// 父类-非静态块
	{
		System.out.println(parentField);
		System.out.println("父类-非静态代码块");
	}

	public ParentTest() {
		System.out.println("父类—无参构造函数");
	}
}

public class StaticIniBlockOrderTest extends ParentTest {
	public static String STATIC_FIELD = "静态属性";

	// 静态块
	static {
		System.out.println(STATIC_FIELD);
		System.out.println("静态代码块");
	}

	public String field = "非静态属性";

	// 非静态块
	{
		System.out.println(field);
		System.out.println("非静态代码块");
	}

	public StaticIniBlockOrderTest() {
		System.out.println("无参构造函数");
	}

	public static void main(String[] args) {
		StaticIniBlockOrderTest test = new StaticIniBlockOrderTest();
	}
}

 执行结果:

父类-静态属性
父类-静态代码块
静态属性
静态代码块
父类-非静态属性
父类-非静态代码块
父类—无参构造函数
非静态属性
非静态代码块
无参构造函数

 执行结果已经很明显的说明了代码的执行顺序。

 

 

猜你喜欢

转载自pigcircle-126-com.iteye.com/blog/2398905
今日推荐