面試?yán)}1:下面哪一項(xiàng)說法是正確的?
A.在一個(gè)子類中一個(gè)方法不是public的就不能被重載
B.覆蓋一個(gè)方法只需要滿足相同的方法名和參數(shù)類型就可以了
C.覆蓋一個(gè)方法必須需要相同的方法名參數(shù)和返回類型
D.一個(gè)覆蓋的方法必須有相同的方法名、參數(shù)名和參數(shù)類型
解析:
對(duì)于在同一可訪問區(qū)內(nèi)被聲明的幾個(gè)具有不同參數(shù)列(參數(shù)的類型、個(gè)數(shù)、順序不同)的同名函數(shù),程序會(huì)根據(jù)不同的參數(shù)列來確定具體調(diào)用哪個(gè)函數(shù),這種機(jī)制叫重載,重載不關(guān)心函數(shù)的返回值類型。覆蓋是指派生類中存在重新定義的函數(shù),其函數(shù)名、參數(shù)列、返回值類型必須同父類中的相對(duì)應(yīng)被覆蓋的函數(shù)嚴(yán)格一致,覆蓋函數(shù)和被覆蓋函數(shù)只有函數(shù)體(花括號(hào)中的部分)不同,當(dāng)派生類對(duì)象調(diào)用子類中該同名函數(shù)時(shí)會(huì)自動(dòng)調(diào)用子類中的覆蓋版本,而不是父類中的被覆蓋函數(shù)版本,這種機(jī)制就叫做覆蓋。
成員函數(shù)被重載的特征如下。
?。?)相同的范圍(在同一個(gè)類中);(2)函數(shù)名字相同;(3)參數(shù)不同;(4)virtual關(guān)鍵字可有可無。
覆蓋的特征如下。
?。?)不同的范圍(分別位于派生類與基類);(2)函數(shù)名字相同;(3)參數(shù)相同;(4)基類函數(shù)必須有virtual關(guān)鍵字。
答案:C
面試?yán)}2:下面的說法中哪項(xiàng)是正確的?
A.靜態(tài)方法不能被覆蓋成非靜態(tài)的方法
B.靜態(tài)方法不能被聲明成私有的
C.私有的方法不能被重載
D.一個(gè)重載的方法在基類中不通過檢查不能拋異常
解析:JDK 1.1版本會(huì)發(fā)布這樣一個(gè)提示信息:靜態(tài)的方法不能被覆蓋。選項(xiàng)B和C的說法并不合理,沒有合理的理由來說靜態(tài)的方法不能被聲明成私有的,或私有的方法不能被重載。選項(xiàng)D是對(duì)于一個(gè)覆蓋方法異常限制的混雜版本來說的。
答案:A
面試?yán)}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"?(下面哪個(gè)選項(xiàng)的代碼替換到//Here,會(huì)調(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類的實(shí)例需要把Base類顯示轉(zhuǎn)換為Agg類,然后調(diào)用Agg類中的getFields()方法。如果a是Base類的一個(gè)實(shí)例的話,它要調(diào)用getFields()方法,那此方法在Base類中是不存在的,必須把a(bǔ)轉(zhuǎn)換為Agg類的一個(gè)實(shí)例,這樣才可以調(diào)用它里面的方法。
答案:D
面試?yán)}4:如果在下列代碼中的Here處添加一段代碼,問哪一個(gè)選項(xiàng)不能通過編譯[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(){}
解析:選項(xiàng)A不能通過編譯。一個(gè)方法是顯式地返回一個(gè)int值的方法,另一個(gè)是在同一個(gè)類中上述方法的一個(gè)重定義。方法中參數(shù)從i換做z對(duì)一個(gè)方法并沒有任何影響。一個(gè)方法不能在同一個(gè)類中被覆蓋。
答案:A
面試?yán)}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();
}}
解析:每新建一個(gè)對(duì)象,都會(huì)產(chǎn)生一個(gè)構(gòu)造函數(shù),因?yàn)楫a(chǎn)生構(gòu)造函數(shù)的順序是A,B,A,所以結(jié)果是A,B,A。
答案:A,B,A
面試?yán)}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";
}
解析:父類里的東西也可以理解成你自己的東西。也就是說在程序里面有兩個(gè)value,一個(gè)是123,另一個(gè)是456。而現(xiàn)在要輸出的是父類里面的那個(gè)value,所以就是123。原因是在輸出語句中使用的是getValue()方法,而這個(gè)方法就是父類里面的方法。它的返回值是父類里面定義的value,從父類繼承來的沒有被子類覆蓋的方法操作的是繼承于父類的被隱藏的變量,也就是123。
答案:123