教材學習內容總結
第四章
類與對象
在定義類這個小結里,有很多新的術語,書上的比喻很形象,對於理解這部分的內容有很大幫助,現總結如下:
•類與對象的關系:要產生對象必須先定義類,類是對象的設計圖,對象是類的實例,
•新建一個對象:使用 new 關鍵詞(例如:new Cloth();)(相當於建立一件衣服)
•聲明參考名稱(聲明參考變量)(聲明參考):也就是給新變量起個名字(例如:Clothes c1)
•將名稱參考至新建對象:就是把新變量的名字賦給這個新變量(例如:Clothes c1 = new Clothes();)(給新衣服貼上標簽)
•定義值域成員(定義對象數據成員):每個新建的實例都可擁有這些對象數據(衣服的各種屬性)例如:
class Clothes {
//定義Clothes類,相當於衣服的設計圖,里面包含color和size
String color;
char size;
}
public class Field {
public static void main(String[] args) {
Clothes sun = new Clothes();
Clothes spring = new Clothes();
//建立Clothes實例(給新的Clothes起名字,分別叫sun、spring)
sun.color = "red";
sun.size = 'S';
spring.color = "green";
spring.size = 'M';
//為個別對象的數據成員指定值(定義衣服sun和spring的color及size)
System.out.printf("sun(%s,%c)%n", sun.color, sun.size);
System.out.printf("spring(%s,%c)%n", spring.color, spring.size);
//顯示個別對象的數據或成員值(顯示sun及spring的color和size)
}
}
運行結果:
定義構造函數
函數的意義就是有些操作不需要重復進行,定義完一個函數后,若想進行函數里定義的操作,直接調用函數即可。下面是定義函數及調用函數的例子:
class Clothes2 {
String color;
char size;
Clothes2(String color,char size){
//定義構造函數
this.color = color;
//前一個color:函數里的第一個變量;后一個color:之前定義的值域成員;這句話是把color參數的值指定給這個對象的color成員
this.size = size;
}
}
public class Field2 {
public static void main(String[] agrs) {
Clothes2 sun = new Clothes2("red",'s');
//使用函數建立對象,定義函數之后傳入數據即可
Clothes2 spring = new Clothes2("green",'M');
System.out.printf("sun(%s,%c)%n",sun.color,sun.size);
System.out.printf("spring(%s,%c)%n",spring.color,spring.size);
}
}
使用標准類
教材里介紹了兩個基本的標准類:java.util.Scanner和java.math.BigDecimal,下面是我對這部分內容的理解:
•java.util.Scanner
我覺得java.util.Scanner就是在用戶使用System.in對象上的read()方法進行輸入時,幫助用戶將轉換字符類型的,需要用到java.util.Scanner的時候,可以在代碼最前面寫 上“import java.util.Scanner”,接下來每次輸入Scanner即可
•java.math.BigDecimal
我覺得java.math.BigDecimal能夠提高浮點數精確度,需要用到java.math.BigDecimal的時候,跟java.util.Scanner一樣,在代碼最前面寫上“import java.math.BigDecimal”, 接下來每次輸入BigDecimal即可
對象指定與相對性
•“”與“equals()”的區別
在操作對象時,“”是用在比較兩個參考名稱是否參考到同一對象,“equals()”是比較兩個對象實際的內含值是否相同,打個比方就是“==”是比較兩個標簽是否綁在了同一件 衣服上,有的衣服完全一樣但並不是同一件;“equals()”是比較這兩件衣服是不是一樣的
基本類型打包
•打包器:Long、Ingeter、Double、Float、Boolean
•打包基本類型:Integer wrapper1 = new Integer(data1);//把data1的內容打包到wrapper1里了
•自動裝箱拆箱:例如:
Integer wrapper = 10;//自動將信息裝入wrapper
int foo = wrapper;//自動拆箱,將wrapper里的信息拿出來給foo
數組對象
•數組在java中是對象
•索引由0開始,若超出索引范圍,則會拋出ArrayIndexOutOfBoundsException錯誤
•增強式for循環:
for(int score : score){
System.out.printf("學生分數:%d%n",score);
}
•聲明二維數組:
int[][]cords = {
{1,2,3},
{4,5,6}
};//聲明二維數組並賦初始值
for(int x = 0;x < cords.length;x++){ //得知有幾列
for(int y = 0;y < cords[x].length;y++){ //取得每列的長度
System.out.printf("%2d",cords[x][y]); //指定列、行索引取得數組元素
}
}
•System.arraycopy()與Arrays.copyOf()
System.arraycopy()與Arrays.copyOf()都是可以進行數組的復制,但都是執行淺層復制,並沒有實際復制出對象,若要連同對象一起復制,需自行操作
System.arraycopy()用法:System.arraycopy(來源數組,來源起始索引,目的數組,目的起始索引,復制長度);
Arrays.copyOf()用法:int score = Arrays.copyOf(來源數組,新數組長度);
•淺拷貝與深拷貝:
淺拷貝:並不是將對象復制到新的索引處,而是將來源數組里面的內容給新數組參考
深拷貝:將來源數組里面的內容復制給新數組
舉例:就像是一本書,淺拷貝是兩個人一起看,深拷貝是第二個人將第一個人的書進行復印,之后兩個人每個人都有一本書,而且這兩本書的內容一樣
字符串對象
•String:字符串常量,字符串長度不可變
•StringBuilder:字符串累加,字符串長度可變(用法:builder.append(i).append('+');)
•StringBuffer:處理同步問題,在多線程環境下使用,讓對象自行管理同步問題
第五章
封裝
封裝的目的:隱藏對象細節,將對象當作黑箱進行操作
•封裝對象初始流程:構造函數
優點:不用重復撰寫對象初始化流程
•封裝對象操作流程:定義方法
優點:對象可以自己處理相關數據
•封裝對象內部數據:使用private關鍵字定義,並提供取值方法成員
優點:用戶無法知道、更改類中的私有數據
類語法細節
•public
如果想在其他包的 類程序代碼中存取某包的類或對象成員,則該類或對象成員必須是公開成員,在Java中要使用public加以聲明
可聲明:公開類、公用構造函數、公開方法
•構造函數與方法重載
構造函數:與類名稱同名,無須聲明返回類型的方法
如果定義類時,沒有撰寫任何構造函數,編譯程序會自動加入一個無參數、內容為空的構造函數,如果自行編寫了構造函數,編譯程序就不會自動建立默認構造函數
重載構造函數:定義多個構造函數,只要參數類型或個數不同
重載定義方法:可為類似功能的方法提供統一名稱,根據參數類型或個數的不同調用對應的方法
返回值不可作為方法重載的依據,可能會出現返回值類型不同但是返回值相同的情況,此時編譯程序會將兩個方法重載視為重復定義而編譯失敗
•this、final、static
this:在java中,this()代表了調用另一個構造函數,至於調用哪個構造函數,則是調用this()時給的自變量類型與個數而定
this()調用只能出現在構造函數的第一行
final:如果局部變量聲明了final,表示設值后不能再變動,對象數據成員上也可以聲明final
如果對象數據成員被聲明為final,但沒有明確使用 = 指定值,則表示延遲對象成員值的指定,在構造函數執行流程中,一定要有對該數據成員指定值的動作,否則編譯錯誤
static:被聲明為static的成員,不會讓個別對象擁有,而是屬於類
被聲明為static的方法,可通過類名稱與“.”運算符來調用static方法
如果有些動作想在位碼加載后執行,則可定義static區塊
在static區塊不能出現this關鍵字
•不定長度自變量
要使用不定長度自變量,聲明參數列時要在類型關鍵字后面加上...
使用不定長度自變量時,方法上聲明的不定長度參數必須是參數列最后一個
•內部類
內部類:可以在類中再定義類
內部類本身可以存取外部類的成員
通常非靜態內部類會聲明為private
一個被聲明為static的內部類,通常是將外部類當作名稱空間,可以存取外部類static成員,但不可存取外部類非static成員
•傳值調用
Java中只有傳值調用
教材學習中的問題和解決過程
1.問題:
對教材P93頁的兩段代碼不是很理解,“==”什么時候能看做是指定參考名稱到某個參考對象?
解決:
通過不斷翻閱之前的知識點,我對這兩段代碼的理解如下:之前的代碼沒有經過打包,這兩段代碼因為有“Integer”進行打包,所以看作指定參考名稱到某個參考對象,在這兩段代碼中,兩個參考名稱的兩個對象雖然內含值相同,但是兩個對象打包后,若i在IntegerCache.low和IntegerCache.high之間,會從緩存中傳回Integer實例,第一段代碼中,因為i1,i2的值相等,所以從緩存中傳回的是同一個實例,但第二段代碼中,i在IntegerCache.low和IntegerCache.high之外,直接建立新的 Integer實例,新建立的實例雖然內含值相同,但並不是同一個實例。
2.問題:
在學習第五章的時候沒有辦法區分函數和方法
解決:
上網查了下資料,理解了java里方法和函數的異同:二者本質上是一樣的,在java中一般把類里面的函數叫方法,主要強調這個類的對象封裝了一些屬性和方法,並向外提供服務
代碼調試中的問題和解決過程
1.問題:
在IDEA里敲代碼的時候,會編譯不通過,出現以下問題:
解決方案:
之前一直是把public去掉,這樣也能運行,但是通過對第四章的學習,知道了一個原始碼中可以有多個類定義,但只能有一個是公開類,且文檔中的主文檔名必須與公開類名稱相同,之前操作時一直在同一個主文檔里操作,導致主文檔名與公開類名不相同,現在每次編寫程序都會新建一個文檔,問題解決了。
2.問題:
這周做了一下書后的操作題,在編寫費氏數列的程序時,運行出現了“可能尚未初始化變量”
解決方案:
果然看書看懂了和練習不一定能做好,因為對C語言進行過很多練習,在編寫程序的時候把C語言初始化變量的語法用在java里了,更改后的代碼如下:
import java.util.Scanner;
public class Fibonacci {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n;
Integer[] f = new Integer[100];
f[0] = new Integer(0);
f[1] = new Integer(1);
System.out.print("求幾個費式數?");
n = Integer.parseInt(scanner.next());
if(n == 0||n == 1){
System.out.printf("%d",n);
}
else if(n > 1){
for(int i = 0;i < n;i++){
if(i > 1) {
f[i] = f[i - 1] + f[i - 2];
}
System.out.printf("%3d",f[i]);
}
}
}
}
運行結果如下:
本周代碼托管截圖
之前代碼托管方法有問題,沒有新建項目,而是直接新建代碼片段,但是每周都有上傳代碼,以下是之前上傳代碼的截圖:
其他(感悟、思考等,可選)
在本周的學習過程中,我第一次成功編寫java代碼,雖然代碼不是很難,但是第一次自己思考着編寫java代碼還是很激動的。我覺得看書看明白和實際操作還是有差別的,書能看懂不一定能寫得出好代碼,只有自己不斷地練習,不斷地思考才能真正得到提高。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 1/3 | 18/38 | |
第三周 | 500/1000 | 1/4 | 22/60 |