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函數上栽了很多跟頭,和同學討論后稍微了解了一下。