背景#
馬上就要大三了。從我們這屆開始,學院在大三進行分方向培養,我隨個人興趣選了軟體開發,於是 Java 成為了我的必修課……
7 月 24 日夏季學期結束之後,秉持著「反正閒著也是閒著不如找點事幹」的基本原則,我開始了 Java 的預習(實則是摸魚)。現在已經五天過去了,準備寫個小總結。
教程的選擇#
這個問題我有請教過NEU LUG
群的群友,得到的建議是看慕課,但考慮了自己的實際情況,最終我還是選擇了適合自己的學習方式 —— 讀文檔。在這裡我選用的是廖雪峰教程。至於原因,主要是自己的Git
/JavaScript
/Python
教程看的都是他的,自然Java
也優先選用了。🤣
現在學習了一周,感覺教程各方面講的都蠻細致深入,對Java 14
的新特性有部分涉及,小節後常設練習題讓大家鞏固知識,有什麼知識點不明白也可以評論請教,總體來看是一個很棒的教程。
當前進度#
目前學習了教程前六章和第七章的部分內容,這些章節分別是:
- Java 快速入門
- 面向對象編程
- 異常處理
- 反射
- 註解
- 泛型
- 集合
學習體會#
-
Java 快速入門
這一章講解了 Java 的變量類型和基本語法,總體來看和
c語言
相似度很高,比較容易理解,但還是有一些需要注意的地方。例如:-
Java12 引入的 switch 表達式
String fruit = "apple"; // opt = 1 int opt = switch(fruit){ case "apple"->1; case "pear" ->2; }
-
Java 的數據類型
需要注意的是,除了整數、浮點數、字符和布爾類型外的所有類型,在 Java 中都是引用類型(對象)。
Java 內部使用 UTF-16 存儲字符,因此 Java 的字符佔兩個字節。
為了便於操作,每種基本類型都有其對應的包裝類(如
int
的包裝類為Integer
)。String 是不可變的,對 String 重新賦值,實質上是重新開闢了一片空間並賦值,並將 String 指針重新指向該片空間。
-
var 關鍵字
該關鍵字用於讓編譯器自動推斷類型,類似於 c++ 中的 auto。
var s = "測試"; // s is String
-
數組的遍歷
Java 提供了類似 Python
for ... in ...
的遍歷方式:String[] arr = new String[] { "1", "2", "3" }; for (var item : arr) { System.out.println(item); }
-
-
面向對象編程
面向對象是老生常談的概念了,有 c++ 的學習基礎,理解起來應該不會很困難。至於 Java 核心類,感覺更像是用到時再去查的東西,沒必要熟練掌握。
-
普通字段 / 方法和靜態字段 / 方法
就我個人理解,普通字段 / 方法是應用於對象(實例)的,而靜態字段 / 方法是應用於類本身的。
比如一個學生類,學生個體的姓名、年齡等應該是普通字段,而學生個數這種「類的性質」應作為靜態字段。
除此之外,靜態方法還用於表示可以脫離實例本身而存在的功能,如:
// Number類的靜態方法valueOf,用於構造Number實例,不依存於某個Number Number.valueOf(); // Arrays類的靜態方法sort,用於對數組進行排序,不依存於某個Arrays Arrays.sort();
-
final 關鍵字
final 關鍵字主要有三個作用:
- 用於修飾變量,表示變量不可更改
- 用於修飾方法,表示方法不可被覆寫
- 用於修飾類,表示類不可被繼承
-
接口
接口是抽象類的進一步抽象,只允許擁有公開的方法和靜態且 final 的字段。
-
面向對象基礎的最後四節
面向對象基礎的最後四節:包、作用域、classpath 和 jar、模塊闡明了 Java 代碼的組織形式,個人感覺十分重要。剛開始看會有些懵,可以試著多讀幾遍(雖然我到現在也還很懵嗚嗚嗚)。
-
-
異常處理
Java 的異常處理採用
try...catch...
機制,可以將錯誤一層一層往上拋,該節內容較為簡單,體會不多。 -
反射
反射是一種程序在運行期拿到對象信息的機制,可以在對實例一無所知的情況下調用其方法。例如:通過函數名的字符串調用函數。
在這一章中我覺得較難理解的是動態代理小節(主要是不清楚有什麼用),評論區有一位用戶舉了一個很淺顯的例子,讓我受益匪淺。
-
註解
在我看來,註解是一個很有用的功能。教程中舉了一個很實用的例子,即用自己定義的註解進行批量的參數檢查。這條評論很好地闡述了註解的作用。
-
泛型
泛型又是另一個難跨的坎,主要難點集中在後三節:擦拭法、extends 通配符、super 通配符。
-
擦拭法
Java 的泛型實現使用擦拭法,即所有對泛型的處理工作都是編譯器完成的,虛擬機對泛型一無所知。而這會導致很多問題。
- 泛型不能使用基本類型,因為泛型的實際類型是 Object。
- 無法取得所帶泛型的 Class。
- 無法判斷所帶泛型的類型(instanceof)。
- 不能直接實例化 T 類型,需要借助額外的 Class。
-
extends 和 super 通配符
這兩節主要講在針對泛型的方法中使用 extends/super 通配符導致的性質差異。籠統來說就是,extends 可讀不可寫,super 可寫不可讀。
要理解這個性質,需要明白向上轉型和向下轉型的區別:
向上轉型即通過父類引用子類,向下轉型即通過子類引用父類。前者是安全的,後者是不不安全的。
class Person{} class Student extends Person{} Person person = new Student(); //√ Student student = new Person(); //×
因此,
<? extends Integer>
說明泛型內必然是Integer
或其子類,在這種情況下,將泛型內的Integer
或其子類賦給外部的Integer
是向上轉型,是安全的,而將外部的Integer
賦值給內部的子類是向下轉型,因此會出現錯誤。最終體現出來的性質為「可讀不可寫」。<? super Integer>
與此相反。
-
-
集合
第七章我目前只學了將近一半,目前感覺較為簡單。該章主要講的是基本的數據結構,如數組、鏈表、哈希表等等的使用方式,因為不涉及到設計和實現,該章還是蠻輕鬆的。
未完待續...( 隨 機 更 新 )😝