java中class实例化的过程


/**
* 1.非继承类的实例化顺序: 静态块-->静态字段-->实例块-->实例字段-->构造器
* 2.当静态field赋值当前类的实例,实例初始化,但这个field下面的静态field不会在这个实例化过程中实例化,为甚?
* 可能是这此实例化相当于第二次,所以静态块不执行
* 3.静态field和静态块在jvm只会被初始化一次,而实例field和实力块每次新对象创建都会被实例化
* @author wb-zhangye
*
*/
public class Children {
static {
System.out.println("Children static block");
}

// instance block
{
System.out.println("Children instance block");
}

// constructor
public Children(){
System.out.println("Children Constructor");
System.out.println(CHILDSTATICNUM + ":" + childInstanceNum);
}

// static field
public static final Children CHILD = new Children();
public static final int CHILDSTATICNUM = getNum();
private static int getNum() {
System.out.println("Children static field initialing");
return 911;
}

// instance field
public final int childInstanceNum = getInstanceNum();
private int getInstanceNum() {
System.out.println("Children instance field initialing");
return 110;
}
}


当我们使用一个类时,会有两种使用方式。实例化此类和直接调用此类的静态字段或者静态方法
首先在此声明一点:block和field的优先级相同,他们执行的顺序跟他们的位置相关
@First 直接实例化
1.非继承类的实例化顺序: 静态块||静态字段-->实例块||实例字段-->构造器
2.当静态field赋值当前类的实例,实例初始化,但这个field下面的静态field
不会在这个实 例化过程中实例化,为甚?
可能是这此实例化相当于第二次,所以静态块不执行
3.静态field和静态块在jvm只会被初始化一次,而实例field和实力块每次新对象创建都会被实例化
@Second 使用此类的静态字段
按照静态块||静态field的方式初始化
@Third 使用此类的静态方法
按照静态块||静态field的方式初始化,然后调用静态方法

对于继承体系的类,则是同样的规则,不过静态总是优于非静态。
因为静态方法和field(不管是不是静态)都是编译期确定的,所以不会受到runtime时期的影响。但对于可以被overide非静态方法,如果父类的field或者构造器引用了此方法,此时子类复写的方法万万不能引用子类的非静态field,因为此时子类的非静态field没有初始化,只是默认值。虽然语法上可以这么用,但不是作者的本意
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值