1. 程式人生 > >java比較難面試題(一)

java比較難面試題(一)

  題目二

   60. 執行以下程式,控制檯將列印:?

 public   ExamTest {

                publicstatic void main(String[] args) {

                       System.out.println(newWolf("灰太狼",32.3));

                 }

      }

         class Animal{
              private String desc  ;
             public Animal(){

                      this.desc= getDesc();

                 }

                publicString getDesc(){

                      return"Animal" ;

                 }

                    public    String toString(){    、
                    return desc ;

                 }

     }

      class Wolf  extends Animal{  
                      private String name ;    
                      private double weight ;     
            publicWolf(String name , double weight ){

                   this.name= name ;

                      this.weight= weight ;

                 }

                publicString getDesc(){

                      return"Wolf[name=" + name + ", weight="+weight + "]" ;

                 }

} 

      列印結果是:Wolf[name=null, weight=0.0]

                你猜對了嗎。。。。。。。。。

               當然不能猜了,需要分析下才行,首先看main函式,這裡有個輸出語句,這個輸出語句裡面new 了個物件,下面看這個物件的構造方法(建立一個物件必須走這個

         方法),傳入了兩個引數,引數內容是 "灰太狼",32.3,但是,這時還沒賦值,又要呼叫父類的構造方法,父類構造方法中又呼叫了getDesc()方法,注意子類複寫父類方法

     因此此時呼叫的是子類方法,但是因為子類成員沒有賦值,所以列印的是預設值,即null,和0.0,因此列印了結果了Wolf[name=null,weight=0.0],注意父類的toString()方法

  

題目二.

              58閱讀以下程式,執行結果為

   public classExamTest {  public static void main(String[] args) {  
                 new Derived(); 
 } 
}
    class Base{  
                private int i = 2 ; 
            public Base(){      
              this.display();
    } 
   public voiddisplay(){ 
           System.out.println(i);
   } 
  } 
class
          Derived extends Base{ 
          private int i = 22;  
          public Derived(){ 
      super();       
             i= 222 ; 
 } 
   public voiddisplay(){ 
         System.out.println(i);
   } 
} 

    

  列印結果為   :  0  ;

               自己看到這答案時也很詫異,但是仔細分析下知道原因,下面來分析下

                 首先通過 new Derived()建立子類物件,這時會呼叫空參的構造方法,然後執行父類的構造方法, 然後執行父類構        造方法 中this.display()方法,注意這個this指得是子類物件,即是你建立的物件 ,所以執行的子類的display()方法,思考下列印的i的值是什麼能?此時Derived物件還未建立,屬性還未賦值,Base物件也沒沒有建立成功,因為構造方法還未執行完,所以i也還沒有賦值,綜上所述,列印的結果是0,因為整型成員變數預設為0


   

題目三

                          61.執行下面的程式,控制檯列印結果為


public class ExamTest { 
 	public static void main(String[] args) {  	 	
                        String s1 = "Hello World" ; 
	 	 	String s2 = "Hello " + "World" ; 
	 	 	String temp1 = "Hello " ; 
 	 	        String temp2 = "World" ;  	 	
                        String s5 = temp1 + temp2 ;  	 	
                        boolean flag1 = s1 ==s2 ;  	
                	boolean flag2 = s1==s5 ;  	 	
                        System.out.println("flag1:"+flag1); 
	 	 	System.out.println("flag2:"+flag2); 
	 	} 
} 
                  列印結果:  true|false

    

        

s2和s1一樣指向helloworld,但是,s5是s3和s4地址和,和s1是不同的