來源:https://www.cnblogs.com/lanxuezaipiao/p/3371224.html

收藏必備——精選30道Java筆試題解答(下)

26. 下列哪種異常是檢查型異常,需要在編寫程序時聲明 ()

ANullPointerException BClassCastException CFileNotFoundException D IndexOutOfBoundsException

答案:C

解析:看第2題的解析。

27. 下面的方法,當輸入爲2的時候返回值是多少?()

 public static int getValue(int i) {
int result = 0;
switch (i) {
case 1:
result = result + i;
case 2:
result = result + i * 2;
case 3:
result = result + i * 3;
}
return result;
}

A0 B2 C4 D10

答案:D

解析:注意這裏case後面沒有加break,所以從case 2開始一直往下運行。

28. 選項中哪一行代碼可以替換題目中//add code here而不產生編譯錯誤?()

public abstract class MyClass {
public int constInt = 5;
//add code here
public void method() {
}
}

Apublic abstract void method(int a);

B constInt = constInt + 5;

C public int method();

D public abstract void anotherMethod() {}

答案:A

解析:考察抽象類的使用。

抽象類遵循的原則:

(1)abstract關鍵字只能修飾類和方法,不能修飾字段。

(2)抽象類不能被實例化(無法使用new關鍵字創建對象實例),只能被繼承。

(3)抽象類可以包含屬性,方法,構造方法,初始化塊,內部類,枚舉類,和普通類一樣,普通方法一定要實現,變量可以初始化或不初始化但不能初始化後在抽象類中重新賦值或操作該變量(只能在子類中改變該變量)。

(4)抽象類中的抽象方法(加了abstract關鍵字的方法)不能實現。

(5)含有抽象方法的類必須定義成抽象類。

擴展:抽象類和接口的區別,做個總結吧:

(1)接口是公開的,裏面不能有私有的方法或變量,是用於讓別人使用的,而抽象類是可以有私有方法或私有變量的。

(2)abstract class 在 Java 語言中表示的是一種繼承關係,一個類只能使用一次繼承關係。但是,一個類卻可以實現多個interface,實現多重繼承。接口還有標識(裏面沒有任何方法,如Remote接口)和數據共享(裏面的變量全是常量)的作用。

(3)在abstract class 中可以有自己的數據成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態的不能被修改的數據成員(也就是必須是 static final的,不過在 interface中一般不定義數據成員),所有的成員方法默認都是 public abstract 類型的。

(4)abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關係,interface表示的是"has-a"關係。

(5)實現接口的一定要實現接口裏定義的所有方法,而實現抽象類可以有選擇地重寫需要用到的方法,一般的應用裏,最頂級的是接口,然後是抽象類實現接口,最後纔到具體類實現。抽象類中可以有非抽象方法。接口中則不能有實現方法。

(6)接口中定義的變量默認是public static final 型,且必須給其初值,所以實現類中不能重新定義,也不能改變其值。抽象類中的變量默認是 friendly 型,其值可以在子類中重新定義,也可以在子類中重新賦值。

29. 閱讀Shape和Circle兩個類的定義。在序列化一個Circle的對象circle到文件時,下面哪個字段會被保存到文件中? ( )

class Shape {
public String name;
}
class Circle extends Shape implements Serializable{
private float radius;
transient int color;
public static String type = "Circle";
}

Aname

B radius

C color

D type

答案:B

解析:這裏有詳細的解釋:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

30.下面是People和Child類的定義和構造方法,每個構造方法都輸出編號。在執行new Child("mike")的時候都有哪些構造方法被順序調用?請選擇輸出結果 ( )

class People {
String name;
public People() {
System.out.print(1);
}
public People(String name) {
System.out.print(2);
this.name = name;
}
}
class Child extends People {
People father;
public Child(String name) {
System.out.print(3);
this.name = name;
father = new People(name + ":F");
}
public Child() {
System.out.print(4);
}

}

A312 B 32 C 432 D 132

答案:D

解析:考察的又是父類與子類的構造函數調用次序。在Java中,子類的構造過程中必須調用其父類的構造函數,是因爲有繼承關係存在時,子類要把父類的內容繼承下來。但如果父類有多個構造函數時,該如何選擇調用呢?

第一個規則:子類的構造過程中,必須調用其父類的構造方法。一個類,如果我們不寫構造方法,那麼編譯器會幫我們加上一個默認的構造方法(就是沒有參數的構造方法),但是如果你自己寫了構造方法,那麼編譯器就不會給你添加了,所以有時候當你new一個子類對象的時候,肯定調用了子類的構造方法,但是如果在子類構造方法中我們並沒有顯示的調用基類的構造方法,如:super(); 這樣就會調用父類沒有參數的構造方法。

第二個規則:如果子類的構造方法中既沒有顯示的調用基類構造方法,而基類中又沒有無參的構造方法,則編譯出錯,所以,通常我們需要顯示的:super(參數列表),來調用父類有參數的構造函數,此時無參的構造函數就不會被調用。

總之,一句話:子類沒有顯示調用父類構造函數,不管子類構造函數是否帶參數都默認調用父類無參的構造函數,若父類沒有則編譯出錯。

最後,給大家出個思考題:下面程序的運行結果是什麼?

public class Dervied extends Base {
private String name = "dervied";
public Dervied() {
tellName();
printName();
}

public void tellName() {
System.out.println("Dervied tell name: " + name);
}

public void printName() {
System.out.println("Dervied print name: " + name);
}
public static void main(String[] args){

new Dervied();
}
}
class Base {

private String name = "base";
public Base() {
tellName();
printName();
}

public void tellName() {
System.out.println("Base tell name: " + name);
}

public void printName() {
System.out.println("Base print name: " + name);
}
}
相關文章