1. 程式人生 > >一個很無恥的Java面試題

一個很無恥的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.

總結:變數是先定義後初始化