Java中類與類之間的關係:this
繼承與隱藏:對象
繼承也是一種訪問。繼承
當成員變量聲明爲默認類型時,包外的子類不能繼承該成員變量。編譯
protected與默認類型的區別在於,當成員變量被修飾爲protected時,若訪問該變量的類位於包外,則只有經過繼承才能訪問該變量,不然,即便經過子類類型的引用來訪問,但也不能經過編譯。變量
成員變量的隱藏會在子類具備與其父類的相同名稱的成員變量時發生。其含義是指在子類中直接調用該成員變量時,將調用的是子類的而不是父類的。固然,父類的成員變量確實是被繼承過來了的,只是被隱藏起來了的而已。因此,想要訪問被隱藏起來了的父類的變量,得使用super關鍵字。原理
super與this同屬預約義對象引用。擴展
對象:引用
某個對象引用變量能夠引用自身類型的對象實例或其子類及間接子類的對象。方法
類A繼承於類B,故類A的對象引用變量能夠引用類B的對象,但即便類A的對象引用指向的是類B的對象,當使用類A的對象引用調用與類B中相同名稱的成員變量或方法時,系統仍然認的是類A的對象引用而不是其所指向的對象。不然,需進行強制類型轉換。static
強制類型轉換轉的只是引用類型,對真正指向的對象是不會干預的。在這句話中,還能夠引出另一個意思,即對於編譯而言,只要被轉換的引用類型與轉換後的目標類型是派生或被派生關係,則編譯經過;同時,編譯系統並不知道引用所指向的具體對象是什麼,其只能根據引用類型來判斷轉換有沒有但願。在運行時才能知道是否能進行引用的強制類型轉換。
引用賦值能夠直接將子類引用賦給父類引用;若需將父類引用賦給;子類引用,則必須進行強制類型轉換。
對於引用的比較,Java中有相應的要求:
- 相同類型的引用能夠比較;
- 不一樣類型的引用要進行比較,其中的類型要具備派生關係;
- 引用的比較是比較兩個引用是否指向同一個對象。
方法的重寫:
當父類的引用指向子類對象時,若訪問被重寫的方法,則將訪問的是被從新定義的子類中的方法(這點與訪問類的屬性不一樣)。
若想構成重寫,子類中的方法名與參數列表必須徹底相同(即簽名要一致),此時,要遵循如下規則:
- 返回類型要兼容;
- 訪問級別的限制必定不能比被重寫方法的窄,能夠比被重寫的方法寬;
- 不能重寫被表示爲final的方法。
重寫與繼承的關係:
若父類的方法爲private的,根本不能被子類繼承,既然不能被繼承,也就可能造成重寫了,更談不上要遵循重寫中的規則之類的了。
靜態方法能夠被繼承,但不能被重寫:
- 非靜態方法會試圖重寫靜態方法時,編譯報錯;
- 靜態方法的隱藏。父類和子類都有相同簽名的static方法,但用父類引用調用的是父類方法,用子類引用調用的是子類的方法,與對象無關。
- 當用子類引用調用子類自己沒有的,而父類有並且可繼承(即非private的)的方法時,調用從父類繼承的方法。
能夠在重寫父類的方法時經過super引用相應的父類的方法來擴展子類中重寫了的方法的功能。
隱藏是根據引用的類型來進行調用的(調用static方法和成員變量),重寫是根據對象的類型來進行調用的。
上述說法都是基於面向對象中一個很是重要的原理——替代性,即子類能替代父類。
方法的重載:
只有在同一個類裏纔有方法重載的說法。重載中的對象引用參數是面向引用類型的,而與其所指向的具體對象無關。
final與繼承:
final的類沒法繼承,故沒法重寫該類的方法;final的方法沒法被重寫,只能被繼承。
abstract與繼承:
抽象類永遠不能被實例化,它的主要用途是用於繼承和擴展。
抽象方法只有方法聲明,沒有方法體(即沒有花括號)。
抽象類中能夠有非抽象方法,這種方法每每是抽象類全部將來子類都具備的,且不會由於子類的不一樣而具體實現不一樣的方法。