Java类加载
1.JVM( Java Virtual Machine,“Java虚拟机” )的类装载器ClassLoader(java类),包括系统类、扩展类、用户编写三种类加载器,负责将java的字节码文件从硬盘读取到JVM中(内存),即首次加载java类时,类的静态成员开辟空间,将常量池存放在方法区内存中,对常量池地址解析,并对java类的静态成员变量、静态块、静态方法进行一次初始化。静态资源在类加载到内存时,只加载一次,而new的对象和对象块,每次都会加载。
2.在使用new关键字时,才会创建类的实例
类实例(对象)的创建(构造):先构造父类对象,再构造子类对象
对象构造步骤:
①递归的构造父类的对象(父类对象的构造也为①~③);
②顺序地调用本类成员属性赋初值语句;
③本类的构造方法。
3:对象销毁:先销毁子类,再销毁父类
例如:
第一次加载类,类的静态成员按照类中出现的顺序加载:
父类ParentCL:
package com.classx; public class ParentCL{ //类静态属性 public static int idp = staticForFieldByMethodOfP(); //构造方法 public ParentCL(){ System.out.println("父类构造方法-执行"); } //非静态初始化块 { System.out.println("父类的非静态初始化块-执行"); } //静态初始化块 static{ System.out.println("父类的静态初始化块-执行"); } //类静态方法 public static void staticMethodByP(){ System.out.println("父类的静态方法-执行"); } //类静态方法 public static int staticForFieldByMethodOfP(){ System.out.println("父类的静态属性-执行"); return 4466; } @Override protected void finalize() throws Throwable { System.out.println("父类销毁方法"); super.finalize(); } }
子类ChildCL:
package com.classx; public class ChildCL extends ParentCL{ //类静态属性 public static int idc = staticForFieldByMethodOfC(); //构造方法 public ChildCL(){ System.out.println("子类构造方法-执行"); } //非静态初始化块 { System.out.println("子类的非静态初始化块-执行"); } //静态初始化块 static{ System.out.println("子类的静态初始化块-执行"); } //类静态方法 public static void staticMethodByC(){ System.out.println("子类的静态方法-执行"); } //类静态方法 public static int staticForFieldByMethodOfC(){ System.out.println("子类的静态属性-执行"); return 5555; } @Override protected void finalize() throws Throwable { System.out.println("子类销毁方法"); super.finalize(); } }
类加载调用:
package com.classx; public class Classxloadernew { public static void main(String[] args) { ParentCL.staticMethodByP(); } }
输出为:
父类的静态属性-执行
父类的静态初始化块-执行
父类的静态方法-执行
new使用测试:
package com.classx; public class Classxloadernew { public static void main(String[] args) { ChildCL ccl = new ChildCL(); } }
输出为:
父类的静态属性-执行
父类的静态初始化块-执行
子类的静态属性-执行
子类的静态初始化块-执行
父类的非静态初始化块-执行
父类构造方法-执行
子类的非静态初始化块-执行
子类构造方法-执行
销毁测试:
package com.classx; public class Classxloadernew { public static void main(String[] args) { ChildCL ccl = new ChildCL(); ccl = null; System.gc(); } }
输出为:
父类的静态属性-执行
父类的静态初始化块-执行
子类的静态属性-执行
子类的静态初始化块-执行
父类的非静态初始化块-执行
父类构造方法-执行
子类的非静态初始化块-执行
子类构造方法-执行
子类销毁方法
父类销毁方法