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