1. 本周學習總結
初學面向對象,會學習到很多碎片化的概念與知識。嘗試學會使用思維導圖將這些碎片化的概念、知識組織起來。請使用紙筆或者下面的工具畫出本周學習到的知識點。截圖或者拍照上傳。
2. 書面作業
- 代碼閱讀
public class Test1 {
private int i = 1;//這行不能修改
private static int j = 2;
public static void main(String[] args) {
geti();
Test1.getj();//是漏了點號嗎?
}
public static void geti() {
System.out.println(i);
}
public static void getj() {
System.out.println(j);
}
}
以上代碼可否編譯通過?哪里會出錯?為什么?嘗試改正?
如果創建3個Test1對象,有內存中有幾個i,幾個j?請分析原因?
答:不能通過,放入eclipse中馬上報錯顯示
原來是因為靜態方法中不能調用非靜態成員。
如果要修改的話按照提示可以馬上修改好,但是因為限制了不能修改第一行,所以好像就沒有那么容易了,但是當我們了解了為什么靜態方法不能調用非靜態成員的原因后調用靜態方法或屬性可以不用new對象,但是非靜態方法或屬性需要new對象才能使用,如果非靜態變量已經創建了對象那么靜態方法就能調用所以可以這樣
public static void geti(){
System.out.println((new Test1().i);
}
如果創建3個Test1對象,有內存中有3i,1j.
因為非靜態變量成員屬於每一個對象,而靜態成員屬於類。
- 構造函數有什么用?其編寫格式是什么?如果一個類不寫構造函數,它有構造函數嗎?如果一個類中只有帶參的構造函數,它有沒有不帶參數的默認構造函數?
答:構造函數
- 作用:對類進行初始化
- 編輯格式:構造函數的名稱和類名相同/無返回類型/可以帶參或者不帶參。
舉個例子
public class Test{
public Test(){
System.out.println("Test is initializing!");
}
public static void main(String args[]){
Test test = new Test();
}
}
- 有構造函數,系統會默認一個無參構造方法
- 如果自己編寫了帶參的構造函數,系統就不會提供不帶參的構造函數了,需要自己編寫。不信可以用eclipse驗證一下。
- 使用
java.lang.Math
類的函數時,為什么不需要new?如果new Math()會產生什么錯誤?分析原因?
答:查看源代碼
我們發現java.lang.Math
函數是用靜態定義的,而使用靜態的方法可以不用new一個對象。
如果new Math(),我們看到上面的圖片已經顯示了---由於構造函數被聲明為私有的,就是說明不能被外部調用,所以不能調用new Math(),並且Don't let anyone instantiate this class也說明不會產生Math對象。
- 什么是重載?什么是構造函數重載?在java.lang.Math類中舉出1個函數重載的例子?怎么才能區分兩個重載函數?
答:
重載就是方法重名參數不同,
理解了重載,構造函數的重載理解起來也容易多了,用相同的類名不同的參數來初始化一個類。
同樣可以查看源代碼找例子,但是因為代碼比較多容易看亂我們需要更簡潔的界面這是就可以用老師之前給我們的
來找例子
很快我們就找到了
我們要善用這個文件啊。
區分兩個重載函數可以通過看他們的參數來區別
- final修飾的變量不能改變,為什么如下代碼可以正常運行?
final int[] NUMBS= {1,2,3,4,5};
NUMBS[2] = 1;
答:
回答這題還是比較困惑的,但是只要我們搞清楚什么是對象和對象的變量就還是能理出思路的,如果上課認真聽的話我們就會發現這么一句話-----final修飾引用類型變量,變量的值(引用)不能修改,但是變量指向的對象的值可以修改。所以這段代碼是可以運行的。
- 閱讀代碼EmployeeTest.java,回答:
1.為什么其屬性均為private?這樣設計有什么好處?
答: 因為這樣才能保證類的封裝性,只允許在類的內部訪問不能再外部訪問,保證了安全性私密性等,如果要訪問就要用setter/getter。
2.為Employee類增加一個無參構造函數,調用其有參構造函數,設置name為雇員1, salary為3000, hireDay的年月日為2017年3月5日。(粘貼代碼)
答: 我們發現在一個構造函數中調用另一個構造函數用this最方便了
public Employee(){
this("雇佣1",3000,2017,3,5);
}
3.為Employee類再增加一個有參構造函數,參數只有name與salary,hideDay為當前日期。(粘貼代碼)
答:同樣的用this,
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));
}
- 編寫函數
public static boolean isMondayToFriday()
功能:判斷今天如果是周一到周五,直接輸出如“上班時間”並返回true,否則輸出“休息時間”。
提示:使用LocalDateTime, DayOfWeek
參考資料:
JAVA 8:健壯、易用的時間-日期API - ImportNew.pdf
Java8DateTimeTest.java
public static boolean isMondayToFriday(){
LocalDateTime now = LocalDateTime.now();
DayOfWeek dayOfWeek = now.getDayOfWeek();
if(dayOfWeek!=DayOfWeek.SATURDAY && dayOfWeek!=DayOfWeek.SUNDAY){
System.out.println("上班時間");
return true;
}
else{
System.out.println("休息時間");
return false;
}
}
- Runnable Jar(可選)
我們以前編寫的程序,必須打開Eclipse或者將相應的.class文件拷貝出來在命令行下執行相應命令才能運行,如果.class文件較多且類文件中有包名,需要將完整的目錄結構及文件拷貝出來,才能運行。現在希望將Eclipse項目中的Java文件打打成一個可運行的jar包,在命令行直接運行。改造題目7,使其從命令行接收參數,參數為年-月-日
,將項目打成jar包,然后在命令行通過java -jar
運行,並截圖。參考文件如下: