1、java执行时是动态加载class的,不是一次性加载完。
2、classloader的分层:
最上一层是bootclassLoader,然后是扩展(Extesion classloader)、应用(Application classLoader,用户自定义的class)、其他loader
注意:classLoader在load 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();
}
}
执行结果:
父类-静态属性
父类-静态代码块
静态属性
静态代码块
父类-非静态属性
父类-非静态代码块
父类—无参构造函数
非静态属性
非静态代码块
无参构造函数
执行结果已经很明显的说明了代码的执行顺序。