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是不同的