2013年7月30日 星期二

HTC考題

最近南征北討,面試不少公司,有一家H開頭的大公司,他的Java考題讓我印象深刻:

package com;

public class A {
{
System.out.println("class A's Object Parameter");
}

static public void printStatic(){
System.out.println("class A's printStatic");
}
}

package com;

public class C extends A{
{
System.out.println("class C's Object Parameter");
}

static public void printStatic(){
System.out.println("class C's printStatic");
}
}


package com;

public class Main {
public static void main(String[] args){
A a2 = new C();
a2.printStatic();
}
}

請問結果如何?

其實我們一般在寫物件導向程式時,最熟悉的是多型(polymorphism),其中有一項叫作Dynamic Binding,就是執行時期才知道它呼叫的函式是那一個。若上述題目不是static function,大家會很直覺知道答案是class C's printStatic。但這題是static function,所以它呼叫printStatic並不會使用Dynamic Binding,而是會根據a2的原始型別判斷呼叫的函式,故它會呼叫A的printStatic,結果就是印出" class A's printStatic"。

除此之外,在A和C class中間都有一段用{ }括起來的程式碼,我當初看得時候也覺奇怪,因我從來沒有用過這樣的寫法,但照題目上的說明,我估計是物件生成時會去執行其中的程式碼。而C class有繼承A class, 故在new C物件時,應會先去執行A class { }中的程式碼,因此最後的結果為:
class A's Object Parameter
class C's Object Parameter
class A's printStatic



沒有留言:

張貼留言