面試例題1:下面哪一項說法是正確的?
A.在一個子類中一個方法不是public的就不能被重載
B.覆蓋一個方法只需要滿足相同的方法名和參數(shù)類型就可以了
C.覆蓋一個方法必須需要相同的方法名參數(shù)和返回類型
D.一個覆蓋的方法必須有相同的方法名、參數(shù)名和參數(shù)類型
解析:
對于在同一可訪問區(qū)內(nèi)被聲明的幾個具有不同參數(shù)列(參數(shù)的類型、個數(shù)、順序不同)的同名函數(shù),程序會根據(jù)不同的參數(shù)列來確定具體調(diào)用哪個函數(shù),這種機制叫重載,重載不關(guān)心函數(shù)的返回值類型。覆蓋是指派生類中存在重新定義的函數(shù),其函數(shù)名、參數(shù)列、返回值類型必須同父類中的相對應被覆蓋的函數(shù)嚴格一致,覆蓋函數(shù)和被覆蓋函數(shù)只有函數(shù)體(花括號中的部分)不同,當派生類對象調(diào)用子類中該同名函數(shù)時會自動調(diào)用子類中的覆蓋版本,而不是父類中的被覆蓋函數(shù)版本,這種機制就叫做覆蓋。
成員函數(shù)被重載的特征如下。
?。?)相同的范圍(在同一個類中);(2)函數(shù)名字相同;(3)參數(shù)不同;(4)virtual關(guān)鍵字可有可無。
覆蓋的特征如下。
?。?)不同的范圍(分別位于派生類與基類);(2)函數(shù)名字相同;(3)參數(shù)相同;(4)基類函數(shù)必須有virtual關(guān)鍵字。
答案:C
面試例題2:下面的說法中哪項是正確的?
A.靜態(tài)方法不能被覆蓋成非靜態(tài)的方法
B.靜態(tài)方法不能被聲明成私有的
C.私有的方法不能被重載
D.一個重載的方法在基類中不通過檢查不能拋異常
解析:JDK 1.1版本會發(fā)布這樣一個提示信息:靜態(tài)的方法不能被覆蓋。選項B和C的說法并不合理,沒有合理的理由來說靜態(tài)的方法不能被聲明成私有的,或私有的方法不能被重載。選項D是對于一個覆蓋方法異常限制的混雜版本來說的。
答案:A
面試例題3:給定下面的代碼。
class Base {}
class Agg extends Base{
public String getFields(){
String name = "Agg";
return name;
}}
public class Avf{public static void main(String argv[]){
Base a = new Agg();
//Here
}}
What code placed after the comment //Here will result in calling the getFields method resulting in the output of the string "Agg"?(下面哪個選項的代碼替換到//Here,會調(diào)用getFields方法使輸出結(jié)果輸出字符串"Agg"?)
A. System.out.println(a.getFields());
B.System.out.println(a.name);
C.System.out.println((Base) a.getFields());
D.System.out.println( ((Agg) a).getFields());
解析:Base類型要引用Agg類的實例需要把Base類顯示轉(zhuǎn)換為Agg類,然后調(diào)用Agg類中的getFields()方法。如果a是Base類的一個實例的話,它要調(diào)用getFields()方法,那此方法在Base類中是不存在的,必須把a轉(zhuǎn)換為Agg類的一個實例,這樣才可以調(diào)用它里面的方法。
答案:D
面試例題4:如果在下列代碼中的Here處添加一段代碼,問哪一個選項不能通過編譯[Trend公司2005年10月面試題]
public class Upton{public static void main(String argv[]){
}
public void amethod(int i){}
//Here
}
A.public int amethod(int z){}
B.public int amethod(int i,int j){return 99;}
C.protected void amethod(long l){}
D.private void anothermethod(){}
解析:選項A不能通過編譯。一個方法是顯式地返回一個int值的方法,另一個是在同一個類中上述方法的一個重定義。方法中參數(shù)從i換做z對一個方法并沒有任何影響。一個方法不能在同一個類中被覆蓋。
答案:A
面試例題5:下面代碼的輸出結(jié)果是多少?[Trend公司2005年10月面試題]
class A {
public static void prt() {
System.out.println("1");
}
public A() {
System.out.println("A");
}}
public class B extends A {
public static void prt() {
System.out.println("2");
}
public B() {
System.out.println("B");
}
public static void main(String[] args) {
A a = new B();
a = new A();
}}
解析:每新建一個對象,都會產(chǎn)生一個構(gòu)造函數(shù),因為產(chǎn)生構(gòu)造函數(shù)的順序是A,B,A,所以結(jié)果是A,B,A。
答案:A,B,A
面試例題6:下面代碼的輸出結(jié)果是多少?[Trend公司2005年10月面試題]
class Parent {
protected String value = "123";
public String getValue() { return value; }}
public class Child extends Parent {
protected String value = "456";
}
解析:父類里的東西也可以理解成你自己的東西。也就是說在程序里面有兩個value,一個是123,另一個是456。而現(xiàn)在要輸出的是父類里面的那個value,所以就是123。原因是在輸出語句中使用的是getValue()方法,而這個方法就是父類里面的方法。它的返回值是父類里面定義的value,從父類繼承來的沒有被子類覆蓋的方法操作的是繼承于父類的被隱藏的變量,也就是123。
答案:123