一個很無恥的Java面試題
深入理解Java虛擬機器
package com.zp.classloader; class Singleton { private static Singleton singleton=new Singleton(); public static int counter1; public static int counter2=0; private Singleton() { counter1++; counter2++; } public static Singleton getInstance() { return singleton; } } public class MyTest { public static void main(String[] args) { Singleton singleton=Singleton.getInstance(); System.out.println("counter1="+singleton.counter1); System.out.println("counter2="+singleton.counter2); } }
答案詳解:首先呼叫類的靜態方法(Singleton.getInstance()),會載入這個類(這裡指Singleton類)。
執行過程:
1.給所有的靜態變數賦予一個預設值(int型別的預設值為0)【singleton=null,counter1=0,counter2=0(賦值操作未執行)】
2.初始化(從上到下開始執行,把右邊的值賦值給左邊)
new Singleton()要生成物件(例項),會自動呼叫它的構造方法。此時counter1++,所以counter=1;counter2++,counter2=1
然後繼續向下執行,此時counter1沒有賦值,故counter1還是等於1, counter2被賦值為0
package com.zp.classloader; class Singleton { public static int counter1; public static int counter2=0; private static Singleton singleton=new Singleton(); private Singleton() { counter1++; counter2++; } public static Singleton getInstance() { return singleton; } } public class MyTest { public static void main(String[] args) { Singleton singleton=Singleton.getInstance(); System.out.println("counter1="+singleton.counter1); System.out.println("counter2="+singleton.counter2); } }
答案詳解:
首先呼叫類的靜態方法(Singleton.getInstance()),會載入這個類(這裡指Singleton類)。
執行過程:
1.給所有的靜態變數賦予一個預設值(int型別的預設值為0)【counter1=0,counter2=0(賦值操作未執行),singleton=null】
2.初始化(從上到下開始執行,把右邊的值賦值給左邊)
此時counter1沒有賦值,故counter1還是等於0.counter2被賦值為0,故counter2=0.
new Singleton()要生成物件(例項),會自動呼叫它的構造方法。此時counter1++,所以counter=1;counter2++,counter2=1. 所以最後counter1=1,counter2=1.
總結:變數是先定義後初始化