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(); } }
执行结果:
父类-静态属性 父类-静态代码块 静态属性 静态代码块 父类-非静态属性 父类-非静态代码块 父类—无参构造函数 非静态属性 非静态代码块 无参构造函数
执行结果已经很明显的说明了代码的执行顺序。