對象的三個特徵:
對象的行爲:可以對對象施加哪些操作,或者可以對對象施加哪些方法?
對象的狀態:當施加哪些方法時,對象如何響應?
對象的標識:如何辨別具有相同行爲與狀態的不同的對象?
對象的行爲是用可調用的方法定義的
對象的狀態每個對象保存着描述當前特徵的信息
對象的狀態可能會隨着時間的改變而變化,但這種改變不是自發的.對象狀態的改變必須通過調用方法實現(如果不進過方法調用也可以改變 說明封裝性 遭到了破壞)
對象的標識對象的狀態並不能完全描述一個對象,每個對象都有唯一的身份,就是對象的標識 例如一個訂單系統中的訂單號.
類之間的關係
依賴 聚合 繼承
依賴 use-a關係 是一種明顯的,最常見的關係 用軟件工程的術語來說就是耦合
聚合 has-a關係 一個對象包含着一些其他對象就是聚合 聚合關係意味着類a的對象包含類b的對象
繼承 is-a 關係
類設計技巧
一定保證數據私有(絕對不要破壞封裝性)
一定要對數據進行初始化
java不會對局部變量進行初始化,但是會對對象的實例化進行初始化.最好不要依賴系統的初始化
不要再類中使用過多的基本類型,
用其他的類代替多個相關的基本類型的使用.
不是所有的域都要獨立的域訪問器或域更改器
將職責過多的類進行分解
類名和方法名要能夠體現出他們的職責
繼承設計的計較
將公共操作和域放在超類
不要使用受保護的域
使用繼承實現is..a的關係
除非所有繼承的方法都有意義,否則不要使用繼承
在覆蓋方法的時候不要改變預期的行爲
使用多態
不要過多使用反射
方法的執行過程
編譯器查看對象的聲明類型和方法名
可能存在多個方法名相同的方法例如f,但參數類型不一樣的方法,編譯器會把這個類的 所有方法f和其他的父類中的訪問屬性爲public且名爲f的方法.
到現在編譯器獲得所有可能被調用的方法
編譯器將查看調用方法時提供的參數類型.
如果在所有名爲f的方法中找到了一個與提供的參數類型完全匹配,就調用哪個方法,這個過程又叫重載解析
到現在編譯器已經獲得需要調用的方法名和參數類型
方法的名字和參數列表稱爲方法的簽名.如果子類中定義了一個與超類簽名相同的方法, 那麼子類中這個方法就將覆蓋超類中的這個方法簽名相同的
方法返回類型不是簽名的一部分,所以在覆蓋方法的時候一定要保證返回類型的兼容性允許子類將覆蓋方法的返回類型定義爲返回類型的子類
如果是private方法 static方法 final方法或者構造器,那麼編譯器將準確的知道自己該調用哪個方法我們將這種調用方式稱爲靜態綁定.與之對應的
調用的方法依賴隱式參數的實際類型,並在運行時實現動態綁定.比如x.f();
當程序運行時,並且採用動態綁定調用方法時,虛擬機一定調用與x所引用對象的實際類型最適合的哪個類的方法,例如x實際是d類型的,d是c的子類,如果d定義了方法f就直接調用f,否則就去d父類中找
因爲這樣每次都要搜索半天,開銷大,因此虛擬機就預先建立了方法表,其中列出了方法簽名和實際方法,這樣只需要找表就好了
//未完...好多都寫在之前的學習總結裏了