JVM學習筆記8:接口初始化與類加載器準備階段和初始化階段的重要意義分析

1、在接口中變量默認是 public static final的,所以可以不寫,點擊會發下報冗餘
package com.shengsiyuan.jvm.classloder;

import java.util.Random;

//當一個接口在初始化的時候,並不要求其父接口都完成了初始化
//只有在真正使用到父接口的時候(如引用接口中所定義的常量時),纔會初始化
public class MyTest5 {
    public static void main(String[] args) {
        System.out.println(MyChild5.b);
    }
}

interface MyParent5 {
    //public static final int a=5;//在接口中變量默認是 public static final的,所以可以不寫,點擊會發下報冗餘
    public static final int a=new Random().nextInt(5);
}
interface  MyChild5 extends MyParent5{
    public static final int b= new Random().nextInt(4);
    //public static final int b=6;
}

2、調用類的靜態方法,準備階段爲靜態變量附上初值,還沒有初始化,接下里初始化,靜態方法和靜態變量沒有先後順序的【我經常認爲先靜態變量再靜態方法,wrong】,順着來就可以了。

package com.shengsiyuan.jvm.classloder;

public class MyTest6 {
    public static void main(String[] args) {
        Singleton singleton=Singleton.getInstance();//調用類的靜態方法,準備階段爲靜態變量附上初值(singleton=null),還沒有初始化,接下里初始化,靜態方法和靜態變量沒有先後順序的【我經常認爲先靜態變量再靜態方法,wrong】,順着來就可以了。
        System.out.println("counter1 : "+singleton.counter1);
        System.out.println("counter2 : "+singleton.counter2);
    }
}
class Singleton{
    public static  int counter1;
    //public static  int counter1=1; //2try輸出結果爲2、0
    //public static  int counter2=0; //1try輸出結果都是1
    private static  Singleton singleton=new Singleton();
    public static  int counter2=0;//輸出結果一個是1,一個是0
    private Singleton(){
        counter1++;
        counter2++;//準備階段的重要意義
        System.out.println(counter1);
        System.out.println(counter2);
    }

    public static Singleton getInstance(){
        return singleton;
    }


}

努力學習ing

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章