Day42--試卷錯題

1hahahahahahahaha發表於2024-12-07

Day42--試卷錯題

Java 基礎語法試卷

二、填空題(每題 3 分,共 30 分)

  1. 已知一個ArrayList集合list,要獲取集合中元素的個數,可以使用list._length_________方法。

    ××××××××××××××××××××××××××××××××××××

    ArrayList集合中,要獲取元素的個數,應該使用的方法是size(),正確的寫法是list.size()

  2. 如果要在子類中呼叫父類的構造方法,可以使用__________關鍵字。

    在子類中呼叫父類的構造方法,需要使用的關鍵字是 “super”,

三、簡答題(每題 10 分,共 30 分)

  1. 簡述 Java 中publicprivateprotected修飾符的作用和區別。

    • public:被public修飾的類、成員變數和方法可以在任何類中被訪問,具有最大的訪問許可權,只要能訪問到所在的類,就能訪問其public成員,常用於對外提供公共的介面或者屬性等,方便其他類進行呼叫和操作。
    • private:被private修飾的成員變數和方法只能在其所屬類的內部被訪問,外部類無法直接訪問,這實現了很好的資料封裝和隱藏,讓類內部的資料只能透過類自身提供的公共方法(比如getset方法等)來間接操作,保證了資料的安全性以及類的可維護性。
    • protected:被protected修飾的成員變數和方法可以在其所屬類、子類以及同一個包中的其他類中被訪問。它提供了一種介於publicprivate之間的訪問許可權,用於在繼承關係中控制成員的可見性,子類可以繼承並訪問父類中protected修飾的成員,方便在繼承體系下進行程式碼的擴充套件和複用等情況。
  2. 解釋 Java 中的異常處理機制,包括try-catch-finally語句塊的執行流程。

    • 首先執行try塊中的程式碼,如果在try塊中沒有發生異常,則跳過catch塊,直接執行finally塊(如果有finally塊),然後繼續執行try-catch-finally語句塊之後的程式碼。
    • 如果在try塊中發生了異常,則立即停止try塊中剩餘程式碼的執行,根據異常的型別去匹配catch塊中的異常型別,如果匹配成功,則執行對應的catch塊中的程式碼,處理完異常後,再執行finally塊(如果有),然後繼續執行try-catch-finally語句塊之後的程式碼。如果沒有匹配到合適的catch塊,則異常會向上層丟擲,直到被處理或者導致程式終止。
    • finally塊中的程式碼無論是否發生異常都會被執行,通常用於釋放資源等操作,如關閉檔案流、資料庫連線等,哪怕try塊中使用了return語句,finally塊依然會執行,並且如果finally塊中有return語句,會覆蓋trycatch塊中的return結果哦(這是個容易混淆的點,也可以提及一下)。
  3. 描述 Java 中方法的引數傳遞方式,是值傳遞還是引用傳遞?並舉例說明。

    1. 回答指出了是值傳遞這點正確,但舉例可以更詳細完善些呀,例如:
      • 對於基本資料型別,傳遞的是實際的值,在方法內部對引數的修改不會影響到方法外部的變數。比如:
    public class Main {
        public static void changeValue(int num) {
            num = 10;
        }
    
        public static void main(String[] args) {
            int value = 5;
            changeValue(value);
            System.out.println(value);  // 輸出仍然是 5,因為傳遞的是值的副本,方法內修改不影響外部變數
        }
    }
    
    • 對於引用資料型別,傳遞的是物件的引用地址的副本,雖然在方法內部可以透過引用修改物件的屬性,但如果在方法內部重新賦值引用變數,不會影響到方法外部的引用變數。例如:
    public class Main {
        public static void changeArray(int[] arr) {
            arr[0] = 10;  // 修改陣列元素,透過引用修改了物件(陣列)的屬性,外部能看到變化
            arr = new int[]{20, 30};  // 重新賦值引用變數,相當於讓方法內的引用指向了新的陣列物件,不會影響外部的引用
        }
    
        public static void main(String[] args) {
            int[] array = {1, 2, 3};
            changeArray(array);
            System.out.println(array[0]);  // 輸出 10,因為前面修改了陣列元素生效了,但重新賦值引用沒影響外部引用
        }
    }
    

四、程式設計題(每題 10 分,共 10 分)

編寫一個Java程式,定義一個Rectangle類,包含私有屬性length(長)和width(寬),提供公共的getset方法用於獲取和設定屬性值,以及一個計算矩形面積的方法getArea。在main方法中建立Rectangle類的物件,設定長和寬的值,並輸出矩形的面積。

package com.liu.exercise;
//一個`Java`程式,定義一個`Rectangle`類,
// 包含私有屬性`length`(長)和`width`(寬),提供公共的`get`和`set`方法用於獲取和設定屬性值,以及一個計算矩形面積的方法`getArea`。
// 在`main`方法中建立`Rectangle`類的物件,設定長和寬的值,並輸出矩形的面積。
public class Rectangle {
private int length;
private int width;

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getArea(int a,int b){
        return a*b;
    }

    public static void main(String[] args) {
        Rectangle s1 = new Rectangle();
        s1.width=3;
        s1.length=7;
        System.out.println("要計算的矩形面積為:"+s1.getArea(s1.length, s1.width));
    }
}

上面的程式碼有些問題

  • getArea方法引數問題
    Rectangle類中的getArea方法,它不應該接收額外的引數ab呀,因為這個方法是用於計算當前Rectangle物件的面積,它應該直接使用類中的lengthwidth屬性來計算,所以方法定義修改為public int getArea() { return length * width; }更合適,這樣更符合物件導向的設計思路,透過物件自身的屬性來完成相關計算操作。

答案:

一、選擇題

  1. C 2. A 3. A 4. C 5. A 6. C 7. C 8. A 9. C 10. A

二、填空題

  1. String
  2. a + b
  3. continue
  4. String msg
  5. size
  6. 1, 2, 3
  7. 平方根
  8. super
  9. 自動
  10. 1

三、簡答題

    • public:被public修飾的類、成員變數和方法可以在任何類中被訪問,具有最大的訪問許可權。
    • private:被private修飾的成員變數和方法只能在其所屬類的內部被訪問,外部類無法直接訪問,實現了資料的封裝和隱藏。
    • protected:被protected修飾的成員變數和方法可以在其所屬類、子類以及同一個包中的其他類中被訪問。它提供了一種介於publicprivate之間的訪問許可權,用於在繼承關係中控制成員的可見性。
    • Java 的異常處理機制用於處理程式執行過程中可能出現的錯誤情況,使程式能夠更加健壯和穩定。
    • try-catch-finally語句塊的執行流程如下:
      • 首先執行try塊中的程式碼,如果在try塊中沒有發生異常,則跳過catch塊,直接執行finally塊(如果有finally塊),然後繼續執行try-catch-finally語句塊之後的程式碼。
      • 如果在try塊中發生了異常,則立即停止try塊中剩餘程式碼的執行,根據異常的型別去匹配catch塊中的異常型別,如果匹配成功,則執行對應的catch塊中的程式碼,處理完異常後,再執行finally塊(如果有),然後繼續執行try-catch-finally語句塊之後的程式碼。如果沒有匹配到合適的catch塊,則異常會向上層丟擲,直到被處理或者導致程式終止。
      • finally塊中的程式碼無論是否發生異常都會被執行,通常用於釋放資源等操作,如關閉檔案流、資料庫連線等。
  1. Java 中方法的引數傳遞方式是值傳遞。
    • 對於基本資料型別,傳遞的是實際的值,在方法內部對引數的修改不會影響到方法外部的變數。例如:
public class Main {
    public static void changeValue(int num) {
        num = 10;
    }

    public static void main(String[] args) {
        int value = 5;
        changeValue(value);
        System.out.println(value);  // 輸出仍然是 5
    }
}
- 對於引用資料型別,傳遞的是物件的引用地址的副本,雖然在方法內部可以透過引用修改物件的屬性,但如果在方法內部重新賦值引用變數,不會影響到方法外部的引用變數。例如:
public class Main {
    public static void changeArray(int[] arr) {
        arr[0] = 10;  // 修改陣列元素
        arr = new int[]{20, 30};  // 重新賦值引用變數,不會影響外部的引用
    }

    public static void main(String[] args) {
        int[] array = {1, 2, 3};
        changeArray(array);
        System.out.println(array[0]);  // 輸出 10
    }
}

四、程式設計題

class Rectangle {
    private double length;
    private double width;

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getArea() {
        return length * width;
    }
}

public class Main {
    public static void main(String[] args) {
        Rectangle rectangle = new Rectangle();
        rectangle.setLength(5.0);
        rectangle.setWidth(3.0);
        System.out.println("矩形面積為:" + rectangle.getArea());
    }
}

你可以根據這份試卷進行自我測試和學習鞏固,如有疑問可以隨時向我提問。

相關文章