JAVA面試常問知識總結(二)
- JAVA中的引數傳遞總結
先看兩道筆試題:
1 public class Test2 { 2 3 public static void main (String [] args) { 4 StringBuffer a = new StringBuffer ("A"); 5 StringBuffer b = new StringBuffer ("B"); 6 operate (a,b); 7 System.out.println(a+","+b); 8 } 9
該題會輸出什麼?
1 public class Test2 { 2 3 public static void add3 (Integer i){ 4 int val=i.intValue(); 5 val += 3; 6 i = new Integer (val);
這個又會輸出什麼?
答案是: 1:AB,B 2:0
首先我們應該明白JAVA中的引數傳遞全是以值傳遞的。是基本型別,就拷貝一個基本型別傳進方法;是引用,就拷貝一個引用變數傳進去方法,理解了這兩點就能理解方法操作物件的相關問題了。最好能畫出引用指向物件的圖出來,就能完全理解了。第1題,呼叫operate方法時,傳入了兩個引用a,b的拷貝x,y,這兩個x,y都指向原a,b引用所指向的物件。x.append(y)對它指向的物件(即a指向的物件)進行了操作。而x=y,只是兩個拷貝變數在賦值,並沒有影響到原b所指向的物件。所以b所指向的物件仍然為B。
第2題,i=new Integer(val) 這裡等於重新把i的引用指向別的物件了,所以原有物件的數沒改,而原來的i仍然是指向物件new Integer(0)的。
把握住了JAVA都是傳值並且傳的都是拷貝的話,類似的題大家都能迎刃而解了。 -
1 class SingleTon { 2 private static SingleTon singleTon = new SingleTon(); 3 public static int count1; 4 public static int count2 = 0; 5 6 private SingleTon() { 7 count1++; 8 count2++; 9 } 10 11 public static SingleTon getInstance() { 12 return singleTon; 13 } 14 } 15 16 public class Test { 17 public static void main(String[] args) { 18 SingleTon singleTon = SingleTon.getInstance(); 19 System.out.println("count1=" + singleTon.count1); 20 System.out.println("count2=" + singleTon.count2); 21 } 22 } 23 24 正確答案 25 count1=1 26 27 count2=0 28 29 30 package com.zp.classloader; 31 class Singleton 32 { 33 34 public static int counter1; 35 public static int counter2=0; 36 private static Singleton singleton=new Singleton(); 37 private Singleton() 38 { 39 counter1++; 40 counter2++; 41 } 42 public static Singleton getInstance() 43 { 44 return singleton; 45 } 46 } 47 48 public class MyTest 49 { 50 51 public static void main(String[] args) 52 { 53 Singleton singleton=Singleton.getInstance(); 54 System.out.println("counter1="+singleton.counter1); 55 System.out.println("counter2="+singleton.counter2); 56 } 57 58 59 } 60 61 counter1 = 1; 62 counter2 = 1;
原因:
首先呼叫類的靜態方法(Singleton.getInstance()),會載入這個類(這裡指Singleton類)。
執行過程:
1.給所有的靜態變數賦予一個預設值(int型別的預設值為0)counter1=0,counter2=0(賦值操作未執行),singleton=null
2.初始化(從上到下開始執行,把右邊的值賦值給左邊)
3.new Singleton()要生成物件(例項),會自動呼叫它的構造方法。
題目一:此時counter1沒有賦值,故counter1還是等於0.counter2被賦值為0,故counter2=0.題目二:此時counter1++,所以counter=1;counter2++,counter2=1; 所以最後counter1=1,counter2=1.