`

Java初始化

    博客分类:
  • JVM
阅读更多
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并没有被初始化

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics