201521123081《Java程序設計》 第3周學習總結


1. 本周學習總結

初學面向對象,會學習到很多碎片化的概念與知識。嘗試學會使用思維導圖將這些碎片化的概念、知識組織起來。請使用紙筆或者下面的工具畫出本周學習到的知識點。截圖或者拍照上傳。

參考資料:百度腦圖

2. 書面作業

Q1. 代碼閱讀


public class Test1 {
    private int i = 1;//這行不能修改
    private static int j = 2;

    public static void main(String[] args) {
        geti();
        Test1getj();
    }

    public static void geti() {
        System.out.println(i);
    }

    public static void getj() {
        System.out.println(j);
    }

}

以上代碼可否編譯通過?哪里會出錯?為什么?嘗試改正?

如果創建3個Test1對象,有內存中有幾個i,幾個j?請分析原因?

  • 不能編譯通過;Test1getj(); 會出錯
    因為靜態方法不能調用非靜態的成員變量;

  • 修改如圖
    在靜態方法里面創建其自身的對象;

  • 如果創建3個Test1對象,內存中有3個i,1個j,因為每個static在一個類內只有一個存儲空間,非static對於其中每個對象都會有一個新的存儲空間。

Q2. 構造函數有什么用?其編寫格式是什么?如果一個類不寫構造函數,它有構造函數嗎?如果一個類中只有帶參的構造函數,它有沒有不帶參數的默認構造函數?

  • 作用:在定義類時,可以使用構造函數定義對象建立的初始流程。構造函數是與類名稱同名,無需聲明返回類型的方法。(即多次定義)

  • 編寫格式:

public 類名(){

}

構造函數名稱和類名一樣,無返回類型。

  • 如果一個類不寫構造函數,系統會默認一個無參的構造函數(Default Constructor),無參數、內容為空。

  • 如果一個類中已經有帶參的構造函數,那么編譯系統就不會自動建立默認構造函數。如果

public class Some{
    public Some(int a){
    }
}

那么就只有一個具有int參數的構造函數,不可以用new Some()來創建對象,而必須使用new Some(1)的形式來創建對象。

Q3. 使用 java.lang.Math 類的函數時,為什么不需要new?如果new Math()會產生什么錯誤?分析原因?

  • Math類里面的所有成員變量和成員方法都是靜態的,因此不需要new來實例化;

  • 根據靜態的定義,限定了在類的外部無法調用,這是只需要用import引用就好了,import java.lang.Math,然后用類名.方法就可以調用。

Q4. 什么是重載?什么是構造函數重載?在java.lang.Math類中舉出1個函數重載的例子?怎么才能區分兩個重載函數?

  • 重載(Overlord),函數或者方法有相同的名稱。如方法的重載:

void eg(int n){

}
void eg(double n){

}
//稱為參數類型不同的方法重載;
void eg(int n,int k){

}
void eg(int n){

}
//稱為參數類型個數不同的方法重載;

  • 創建對象時希望有對應的初始流程,定義多個構造函數,只要參數類型和個數不同。

  • java.lang.Math類中重載例子

  • 可以通過參數類型的不同,甚至參數類型排序的不同來區別。

Q5. final修飾的變量不能改變,為什么如下代碼可以正常運行?


final int[] NUMBS= {1,2,3,4,5};
NUMBS[2] = 1;

  • final修飾引用類型變量,指向的變量值不能修改,但指向對象的值可以修改。

Q6. 閱讀代碼EmployeeTest.java,回答:

1. 為什么其屬性均為private?這樣設計有什么好處?

可以通過指定的方法來操作類成員變量,而不能隨意地操作類的變量成員。

2. 為 Employee 類增加一個無參構造函數,調用其有參構造函數,設置name為雇員1, salary為3000, hireDay的年月日為2017年3月5日。(粘貼代碼)


public Employee(String n, double s, int year, int month, int day) { 
      name = n;
      salary = s;
      GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
      // GregorianCalendar uses 0 for January
      hireDay = calendar.getTime();
   }
public Employee() {
   this("雇員1", 3000.0, 2017, 3, 5);
   }

3. 為Employee類再增加一個有參構造函數,參數只有name與salary,hideDay為當前日期。(粘貼代碼)


public Employee(String n, double s, int year, int month, int day) { 
      name = n;
      salary = s;
      GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
      // GregorianCalendar uses 0 for January
      hireDay = calendar.getTime();
   }
public Employee(String n, double s) {
   this(n, s, Calendar.getInstance().get(Calendar.YEAR), 
           Calendar.getInstance().get(Calendar.MONTH) + 1, 
           Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
   }

Q7. 編寫函數public static boolean isMondayToFriday()

功能:判斷今天如果是周一到周五,直接輸出如“上班時間”並返回true,否則輸出“休息時間”。
提示:使用LocalDateTime, DayOfWeek
參考資料:
JAVA 8:健壯、易用的時間-日期API - ImportNew.pdf
Java8DateTimeTest.java


public static boolean isMondayToFriday() {
    LocalDateTime a = LocalDateTime.now();
    int day = a.getDayOfWeek().getValue();
    if (day >= 1 && day <= 5) {
        System.out.println("上班時間");
        return true;
    }
    System.out.println("休息時間");
    return false;       
}

Q8. Runnable Jar(可選)

我們以前編寫的程序,必須打開Eclipse或者將相應的.class文件拷貝出來在命令行下執行相應命令才能運行,如果.class文件較多且類文件中有包名,需要將完整的目錄結構及文件拷貝出來,才能運行。現在希望將Eclipse項目中的Java文件打打成一個可運行的jar包,在命令行直接運行。改造題目7,使其從命令行接收參數,參數為年-月-日,將項目打成jar包,然后在命令行通過java -jar運行,並截圖。參考文件如下:

Eclipse生成Runnable jar

3. 碼雲代碼提交記錄

在碼雲的項目中,依次選擇“統計-Commits歷史-設置時間段”, 然后搜索並截圖

4. PTA實驗

題目集:jmu-Java-03-面向對象1-基礎-封裝繼承 中的編程(5-1, 5-2, 5-3)一定要有實驗總結

實驗5-1
Person類的定義,以及gettet/setter類的使用以及其快捷鍵,學習toString。
實驗5-2
初始化模塊、靜態代碼塊以及構造函數;還有三者的執行順序。
實驗5-3
構造函數和toString函數,我在toString函數上栽了很多跟頭,和同學討論后稍微了解了一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM