1. 程式人生 > >JAVA面試常問知識總結(二)

JAVA面試常問知識總結(二)

  1. 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
    10 static void operate(StringBuffer x, StringBuffer y){ 11 x.append(y); 12 y = x; 13 } 14 }

    該題會輸出什麼?

     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); 
    
    7 } 8 9 public static void main (String args [ ] ) { 10 Integer i = new Integer (0); 11 add3 (i); 12 System.out.println (i.intValue ( )); 13 } 14 }

    這個又會輸出什麼?
    答案是: 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都是傳值並且傳的都是拷貝的話,類似的題大家都能迎刃而解了。

  2.  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.