1. Java套件(Package)
    1. 類似於檔案系統中的目錄
    2. package關鍵字
      1. 關鍵字描述的為類別的"內部路徑"
    3. import關鍵字
      1. 如果在相同套件內,就import語法則可以省略
      2. 實際影響
        1. 可以少寫很多字
    4. 自動匯入套件
      1. java.lang套件
        1. system
        2. eum
  2. 編譯JAVA專案套件
    1. 手動編譯
      1. 編譯
        1. javac java檔案
      2. 執行
        1. java class檔案
    2. 指定類別檔的存放目錄
      1. 希望在編譯過程中同時指定編譯好的類別檔所存放的目錄,可以加上
        1. "-d"參數
          1. 目錄須先建立好
        2. 範例
    3. classpath的設定
      1. 一個類別使用其他類別內容,除了使用
        1. import關鍵字
          1. 來標示內部路徑外,在編譯時還需要
          2. 使用cp(-classpath)
          3. 來標示外部路徑
          4. 也可利用環境變數
          5. CLASSPATH
          6. 範例
          7. 編譯
          8. javac -cp java檔案
          9. 執行
          10. java -cp javac檔案
    4. Jar檔的使用
      1. 以zip格式
        1. 壓縮而成的檔案
      2. 目的
        1. 為了方便攜帶or傳輸
      3. 來源冷笑話
        1. java一種咖啡,jar一種咖啡罐,隨身攜帶而走
  3. 存取修飾詞的使用
    1. public
    2. protected
      1. 只可被
        1. 相同套件的類別存取
        2. 子類別物件存取
    3. default
      1. 只可被
        1. 相同套件的類別存取
    4. private
      1. 延伸
        1. 繼承來不能使用,為何還要繼承
          1. 用途
          2. 封裝
      2. 只能在
        1. 所在類別內存取
  4. 封裝
    1. 封裝步驟
      1. 將屬性以private修飾詞封住,不讓外部類別隨意存取
        1. 保護資料
      2. 撰寫setter和getter,並設成public
        1. 目的
          1. 防止入口太多問題
          2. 設置單一管道
      3. 外部類別透過這兩個方法來存取private屬性
    2. 範例
  5. 抽象類別
    1. abstract
      1. 代表可以只有簽章,沒有實作
    2. abstract語final修飾詞不可供存
    3. abstract語private修飾詞不可共存
    4. 思考
      1. 繼承
        1. 修改某些函式
      2. 抽象類別
        1. 想有好處,又不想負責任
          1. 實作不給你
          2. 不完整
          3. 不能實體化
        2. 想法
          1. 統一的框架
          2. 定義簽章 不做實作
          3. 所以不需要body{}
          4. 不完整
          5. 希望有人幫他完整
    5. 範例
    6. final、private不希望人改,但abstract希望
      1. 所以邏輯衝突
  6. 介面
    1. 為甚麼要有介面
      1. 簡單
        1. 因為JAVA只有單繼承
          1. 好處
          2. 物件模型比較簡單
          3. 繼承成員:方法、屬性
          4. 我有時候只想要其中之一
          5. 運用介面
          6. 去實現方法
    2. 六個最要方法
      1. 1.自動加上abstract 和 public
      2. 2.介面本身
        1. 無法實體化
      3. 3.子類別要實作介面的抽象方法
        1. 否則也必須定義成抽象類別
      4. 4.子介面只可繼承父介面
        1. 問題
      5. 5.介面的屬性會自動加上
        1. final
        2. public
        3. 思考
          1. 等於介面的屬性沒有甚麼用
          2. 介面根本不需要屬性
      6. 介面沒有建構式
      7. 思考
        1. 建構式工作通常就是初始化物件的屬性
          1. 不需要屬性,那何必要建構式
    3. 只有抽象方法
    4. 如何實作介面
      1. 運用implements
    5. 思考
      1. 介面
        1. 就是一個空殼,你要把他完成
        2. 就定義出一系列的行為
          1. 要求把功能都實作出來
        3. 解決多繼承問題
          1. 應該是把所有繼承的成員都繼承過來
          2. 但是會有衝突問題
          3. 所以JAVA才選擇使用單繼承
          4. JAVA介面只是用巧妙方法,來試圖解決多繼承問題
          5. 問題會變太複雜
          6. 程式語言應該是
          7. 有限複雜解決問題
          8. 就是簡單化
    6. PS
      1. 介面相當於半類別
        1. 只是中介產品,為了多繼承用
          1. 表面上看來,介面有點像是完全沒有任何方法被實作的抽象類別,但實際上兩者在語義與應用上是有差別的。「繼承某抽象類別的類別必定是該類別的一個子類」,由於同屬一個類型,只要父類別中也有定義同名方法,您就可以透過父類別型態來操作子類實例中被重新定義的方法,也就是透過父類別型態進行多型操作,但「實作某介面的類別並不被歸屬於哪一類」,一個物件上可以實作多個介面。
      2. 介面 x = new 類型(x); 延伸問題
        1. 物件變數
        2. 介面變數
        3. 真正有功能的是實體
          1. 如何操作物件實體
          2. 最簡單方式
          3. 透過紀錄記憶體位置
          4. 就可以做操作
        4. 子類別一定要有管道呼叫到父類別
          1. 一層一層往下做初始化動作
          2. 等到記憶體都分配好了
        5. 記憶體位置
          1. 只是存取成員不同而已
        6. 誰可以記錄記憶體位置
          1. 變數
          2. 物件變數
          3. 介面變數
          4. 決定介面實體的哪些方法
      3. 為何定義介面
        1. 想用抽象概念
          1. 操作實體
        2. 簡單化
          1. 限縮方法(重點化)
        3. 分門特性
        4. PS
          1. 類似於抽象類別
          2. 但是抽象類別還是類別
          3. JAVA不准許你多重繼承
          4. 要求完善實作
          5. 跟介面不一樣地方
          6. 可以繼承元素
  7. Java的繼承與實作
    1. 一個類別只能繼承一個類別
    2. 任何介面都不可繼承類別
      1. 因為會將一般方法繼承過來而介面只有抽象方法
    3. 任何介面都不可實作介面,因為實作就必須建立一般方法,而介面只有抽象方法
      1. PS
        1. 不要使用介面實作方法
          1. EX
          2. Andriod不支援
  8. 物件的轉型
    1. 向上轉型
      1. 將子類別物件轉型給父類別使用
      2. why?
        1. 簡單來說,對於代碼維護有好處,當你需要更改接口的實現類時,最簡單的是修改new 後邊的東西,而不許修改代碼的其他地方,如果不是面向接口的,修改實現時,還需要修改與此相關的其他代碼……
        2. 就以你和你父親舉個例子吧,你和你父親有父子關係,那麼如果你是個好孩子,你就會聽你父親的話,把你的部分事情交給你父親安排,注意是部分不是所有,如果你是個壞孩子,你就不會讓你父親管你的任何事。在java中,假如類B是類A的子類,如果不向上轉型的話,哪隻能說明B擁有了A的所有非私有屬性及方法,而A是沒有B的屬性及方法的,也就是說B沒有給A任何管理權
          1. 就如你不讓你父親管你任何事情一樣,而如果向上轉型,就相當於B給了A部分管理權。
        3. 轉型可以方便項目的開發,例子:
          1. Object類熟悉吧?有時候我們為了接受任意類型的參數就要使用它,為什麼呢?因為它是所有類的父類啊!
    2. 向下轉型
      1. 父類別物件轉型給子類別使用
      2. 必須為物件上轉型後,再向下轉型。不然會發生錯誤
        1. why?
          1. 事實上,你根本不可能直接在程式碼中進行向下轉型的動作,除非你先把子類別向上轉型,然後再做一次向下轉型。(脫褲子放屁)
      3. 語法格式要加上(類型名),是一種
        1. 強制轉換。
      4. 目的:
        1. 設計上的不得已,為了要通用
    3. PS
      1. 我們都知道子類別一定擁有父類別的所有公開成員
  9. Instanceof運算符號
    1. 可以用來檢查相容
      1. 一個物件實體(Instance)是否屬於指定類型
  10. 多型(Polymorphism)
    1. 所謂多型就是
      1. 主要依靠
        1. 改寫
          1. 來達到目的
      2. 執行時會依據
        1. 物件實體類型
          1. 來呼叫對應的方法
      3. 子類別必須先改寫父類別的方法
      4. 使用多型就是為了避免轉型上的麻煩與可能發生的錯誤。
        1. 但是父類別並不會繼承子類別所有的公開成員
          1. 向上轉型(子→父)的風險永遠比向下轉型(父→子)的風險小。
      5. 目的
        1. 隱藏複雜度
    2. PS
      1. 多型 (polymorphism) 就是運用類別 (class) 間繼承 (inherit) 的關係
        1. 使父類別 (superclass) 可以當成子類別 (subclass) 的通用型態。
      2. 改寫跟多型差別
        1. 改寫的目的最終要達到多型
      3. 會有的問題
        1. 不好追蹤
  11. PS
    1. 通常JAVA編譯錯誤
      1. classpath錯誤
      2. 重要jar檔遺失
    2. 學程式
      1. 只是邏輯概念的展現
      2. 先理解,再來背
      3. 別搞複雜的東西
      4. 不要排斥英文
      5. 多寫
    3. 父類別與子類別關係
      1. 元素不能修改
      2. 方法可以
        1. 可以使用 父類別變數 x = new 子類別();
          1. x名稱物件可以使用修改後子類別的方法
    4. THINK
      1. 改寫與多型的關係