Java初始化

本文探讨了Java虚拟机在首次主动使用类型时的初始化过程,包括创建类实例、调用静态方法、操作静态字段等多种情况。通过具体代码实例展示了不同场景下类的初始化流程,并对比了静态字段的被动使用特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java虚拟机在首次主动使用类型时初始化它们。下面几种情况下会主动使用:

1.创建类的新实例

2.调用类中声明的静态方法

3.操作类或接口中声明的非常量静态字段

4.调用Java API中特定反射方法

5.初始化一个类的子类

6.指定一个类作为Java虚拟机启动时的初始化类


而被动使用(对于子类、子接口和实现了接口的类引用父亲的非常量静态字段)不会触发初始化。

来看下面的一段代码

=====父类

public class NewParent {

static int hoursOfSleep=(int)(Math.random()*3.0);
static{
System.out.println("New parent was initialized...");
}

public NewParent() {

System.out.println("NewParent.NewParent()");
// TODO Auto-generated constructor stub
}
}
========子类

public class NewBornBody extends NewParent{

static int houseOfCrying=6+(int)(Math.random()*2.0);

static{
System.out.println("NewBronBody was initiazed.");
}
}

========JVM启动类

public class Example2 {

public static void main(String[] args){
int hours=NewBornBody.hoursOfSleep;
System.out.println(hours);


}

static{

System.out.println("Example2 was initialized!");
}
}
这段代码的执行结果为:

Example2 was initialized!
New parent was initialized...
0


===================================

如果一个既是static又是final的,使用时就不是对这个类的主动使用。示例代码如下:

public interface Angry {

String greeting="Grrr1";

}


public class Dog {

static final String greeting="wolf,wolf,world!";
static{
System.out.println("Dog was initialized");

}


static int getAngerLevel(){
System.out.println("Angel was initialized!");
return 1;
}


}


public class Example3 {

public static void main(String[] args){

System.out.println(Angry.greeting);
System.out.println(Dog.greeting);

}

static{
System.out.println("Example3 was initialized!");
}
}
========代码的执行结果为:

Example3 was initialized!
Grrr1
wolf,wolf,world!

//可见Dog并没有被初始化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值