amtoaer

晓风残月

叹息似的渺茫,你仍要保存着那真!
github
x
telegram
steam
nintendo switch
email

從零開始的Java學習

背景#

馬上就要大三了。從我們這屆開始,學院在大三進行分方向培養,我隨個人興趣選了軟體開發,於是 Java 成為了我的必修課……

7 月 24 日夏季學期結束之後,秉持著「反正閒著也是閒著不如找點事幹」的基本原則,我開始了 Java 的預習(實則是摸魚)。現在已經五天過去了,準備寫個小總結。

教程的選擇#

這個問題我有請教過NEU LUG群的群友,得到的建議是看慕課,但考慮了自己的實際情況,最終我還是選擇了適合自己的學習方式 —— 讀文檔。在這裡我選用的是廖雪峰教程。至於原因,主要是自己的Git/JavaScript/Python教程看的都是他的,自然Java也優先選用了。🤣

現在學習了一周,感覺教程各方面講的都蠻細致深入,對Java 14的新特性有部分涉及,小節後常設練習題讓大家鞏固知識,有什麼知識點不明白也可以評論請教,總體來看是一個很棒的教程。

當前進度#

目前學習了教程前六章和第七章的部分內容,這些章節分別是:

  • Java 快速入門
  • 面向對象編程
  • 異常處理
  • 反射
  • 註解
  • 泛型
  • 集合

學習體會#

  1. 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 提供了類似 Pythonfor ... in ...的遍歷方式:

      String[] arr = new String[] { "1", "2", "3" };
      for (var item : arr) {
          System.out.println(item);
      }
      
  2. 面向對象編程

    面向對象是老生常談的概念了,有 c++ 的學習基礎,理解起來應該不會很困難。至於 Java 核心類,感覺更像是用到時再去查的東西,沒必要熟練掌握。

    • 普通字段 / 方法和靜態字段 / 方法

      就我個人理解,普通字段 / 方法是應用於對象(實例)的,而靜態字段 / 方法是應用於類本身的。

      比如一個學生類,學生個體的姓名、年齡等應該是普通字段,而學生個數這種「類的性質」應作為靜態字段。

      除此之外,靜態方法還用於表示可以脫離實例本身而存在的功能,如:

      // Number類的靜態方法valueOf,用於構造Number實例,不依存於某個Number
      Number.valueOf();
      // Arrays類的靜態方法sort,用於對數組進行排序,不依存於某個Arrays
      Arrays.sort();
      
    • final 關鍵字

      final 關鍵字主要有三個作用:

      • 用於修飾變量,表示變量不可更改
      • 用於修飾方法,表示方法不可被覆寫
      • 用於修飾類,表示類不可被繼承
    • 接口

      接口是抽象類的進一步抽象,只允許擁有公開的方法和靜態且 final 的字段。

    • 面向對象基礎的最後四節

      面向對象基礎的最後四節:包、作用域、classpath 和 jar、模塊闡明了 Java 代碼的組織形式,個人感覺十分重要。剛開始看會有些懵,可以試著多讀幾遍(雖然我到現在也還很懵嗚嗚嗚)。

  3. 異常處理

    Java 的異常處理採用try...catch...機制,可以將錯誤一層一層往上拋,該節內容較為簡單,體會不多。

  4. 反射

    反射是一種程序在運行期拿到對象信息的機制,可以在對實例一無所知的情況下調用其方法。例如:通過函數名的字符串調用函數。

    在這一章中我覺得較難理解的是動態代理小節(主要是不清楚有什麼用),評論區有一位用戶舉了一個很淺顯的例子,讓我受益匪淺。

  5. 註解

    在我看來,註解是一個很有用的功能。教程中舉了一個很實用的例子,即用自己定義的註解進行批量的參數檢查。這條評論很好地闡述了註解的作用。

  6. 泛型

    泛型又是另一個難跨的坎,主要難點集中在後三節:擦拭法、extends 通配符、super 通配符。

    • 擦拭法

      Java 的泛型實現使用擦拭法,即所有對泛型的處理工作都是編譯器完成的,虛擬機對泛型一無所知。而這會導致很多問題。

      1. 泛型不能使用基本類型,因為泛型的實際類型是 Object。
      2. 無法取得所帶泛型的 Class。
      3. 無法判斷所帶泛型的類型(instanceof)。
      4. 不能直接實例化 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>與此相反。

  7. 集合

    第七章我目前只學了將近一半,目前感覺較為簡單。該章主要講的是基本的數據結構,如數組、鏈表、哈希表等等的使用方式,因為不涉及到設計和實現,該章還是蠻輕鬆的。


    未完待續...( 隨 機 更 新 )😝

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。