Java类加载及创建实例(new)顺序,javanew
分享于 点击 47703 次 点评:240
Java类加载及创建实例(new)顺序,javanew
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();
}
}
输出为:
父类的静态属性-执行
父类的静态初始化块-执行
子类的静态属性-执行
子类的静态初始化块-执行
父类的非静态初始化块-执行
父类构造方法-执行
子类的非静态初始化块-执行
子类构造方法-执行
子类销毁方法
父类销毁方法
相关文章
- 暂无相关文章
用户点评