5.1子類與父類
1 java不支持多重繼承,即一個子類不可以從多個父類中同時繼承,而C++中可以。
人們習慣地稱子類與父類的關系式“is—a”的關系
2 再類的聲明過程中,通過關鍵字extends來定義一個類的子類
eg: class 子類名字 extends 父類名字{
}
3 java中的類按照繼承關系可以形成樹形結構,在這個樹形結構中,根節點是Object類(Object類是java。lang包中的類),即Object類是所有類的祖先類,
每個類除了object類有且僅有一個父類,但是一個類可以有零個或多個子類,
如果一個類在聲明的時候沒有使用extend聲明,那么這個類默認為objetc類的子類
eg: class a與class a extends Object 這兩種聲明是等價的
5.2 子類的·繼承性
如果子類與父類在同一個包中,那么子類會繼承父類中除了private屬性外其他所有的變量和方法,
如果子類與父類不在同一個包中,那么子類會繼承父類中除了private和default外其他屬性的變量和方法;
對於protected屬性的訪問權限
比如·a是b的父類 b是c的父類 c是d的父類 在other類中使用d類創建的一個對象,如果使用這個對象調用的是d類中的protectde屬性的變量或者方法,如果d類與other類在同一個包中,那么就可以訪問,
如果使用對象調用的是d類的祖先類,如果追溯到祖先類,如果祖先類和other類在一個包中,那么便可以調用protectde屬性的變量和方法
5.3子類與對象
1:在使用子類創建對象的時候,系統會為對象分配變量,並且為變量分配內存,所有子類中定義的變量與其父類的變量都會分配內存,但是這些變量並不都屬於對象的,只有可以對象訪問的變量才屬於對象擁有的變量
eg: 比如在同一個包中,父類的private類型的變量也會分配內存,但是這些變量並不屬於子類創建的對象所擁有,,同理,如果不在同一個包中,default屬性的變量也同樣2是這個道理
2:instanceof運算符instanceof運算符是一個雙目運算符,左邊的操作元氏對象,右邊的操作元是類,如果左邊的對象時右邊的類創建的對象,或則是右邊類的子創建的對象
那么返回的值是true,否則返回的值是false
5.4成員變量的隱藏和方法重寫
成員變量的隱藏
只要子類新定義的變量和父類的變量重名,那么父類的變量便會被隱藏,即使類型不一樣也可以
1子類繼承的方法只能操作子類繼承和隱含的成員變量嗎,子類新定義的方法可以操作子類繼承和子類新聲明的成員變量,但是無法操作隱含的成員變量,(如果操作隱含的成員變量,需要使用super關鍵字來進行修飾,在后面還會介紹)
方法重寫
1重寫父類的方法的時候,不可以降低父類方法的訪問權限,但是可以提高訪問權限
2 JDK1.5對重寫的更改,
子類重寫方法的類型可以是父類方法類型的子類型,即不必完全一致,比如說,父類的方法類型是people類,子類的重寫方法類型可以是student類,前提是student類是people類的子類
5.5super關鍵字
1.子類一旦隱藏了繼承的成員變量,那么隱藏的成員變量便不再屬於子類創建的對象擁有,該變量將屬於super關鍵字擁有,被隱藏的·方法也是同樣
eg: super.x或super.play()都是在調用隱藏的成員變量和成方法,都是被隱藏的
2. 由於子類不能繼承父類的構造方法,因此,子類在其構造方法中對父類的構造方法進行調用的時候,super關鍵字所構成的語句必須是第一句,,如果在子類的構造方法中沒有顯示super關鍵字來調用父類的某個構造方法,那么默認會有 super();
super在調用父類的某個構造函數的時候,要注意根據調用的構造函數進行正常的傳參問題
3如果在類中定義一個或多個構造方法的時候,類中不會提供默認的構造方法,就是不帶參數的構造方法。所以,擋在父類定義多個構造方法的時候,應當包含一個不帶參數的構造方法,以防止子類省略super關鍵字的時候,系統默認生成默認的super()已造成出現錯誤。
5.6 final關鍵字
final關鍵字可以修飾類,成員變量和方法中的局域變量,以及方法
1.
final修飾的類不允許繼承,就是不可以有子類
2.final修飾方法不可以被隱藏,就是子類不可以對其進行更改重寫,只能好好的繼承
3.final修飾變量就是常量,常量在程序運行的過程中不可以被更改,所以在用final聲明常量的必須直接進行初始化
5.7 對象的上轉型對象
上轉型對象的特點
上轉型對象就是講子類創建的對象的引用賦值給父類聲明的對象
1. 上轉型對象不可以操作子類新增的成員變量,也不可以操作子類新增的成員方法
2. 上轉型對象可以調用子類繼承的成員變量以及成員方法,可以調用被隱藏的成員變量和方法,,,,,但是如果子類重寫了某個實例方法的話,那么上轉型對像調用方法的時候調用的是重寫之后的方法
1可以將對象的上轉型對象強制轉化為子類的對象,那么該對象再次具有了子類對象的功能。
2 不可以將父類創建的對象的引用賦值給子類聲明的對象
3.如果子類重寫了父類的靜態方法,那么子類對象的上轉型對象只能調用父類的靜態方法,,不可以調用子類重寫的靜態方法
5.8繼承與多態
什么是多態,當一個類有很多子類的時候,如果子類都重寫了父類的某個方法的話,那么這些子類的對象的上轉型對象調用重寫的方法的時候就會產生多種行為,這就是繼承與多態的關系
5.9 abstract類與abstract方法
1.對於abstract方法,只可以聲明,不允許實現,其實就是沒有方法體
而且記住兩個不要 1:不可以使用final和abstract同時修飾一個方法和類,因為final方法和類不可以被子類繼承,但是abstract類是可以被子類繼承的,因為它需要被子類繼承去實現
2:不可與使用static和abstract同時修飾一個方法,因為abstract方法是實例方法,而static方法是類方法,屬於全局所擁有,是需要被類名才可以被調用的
2.abstract類中可以有abstract方法,也可以由非abstract方法,但是非abstract類中不可以有abstract方法
3.對於abstract類,我們不能使用new創建該類的對象,
具體原因我的理解是比如說人類是一個抽象類,由人類可以產生多個子類,比如中國人,美國人,英國人等等;由於人類是一個高度抽象的概念,至於具體的實現都是其子類具體分析實現的,所以,即使new創建了一個抽象類的對象,也無法調用其高度抽象的方法。
4.如果一個非抽象類是一個抽象類的子類,那么它必須重寫父類的抽象方法,給出方法體,這就是為什么不可以用final和abstract同事修飾一個方法的原因了
5我們雖然不可以用new創建一個abstract類的對象,但是我們可以聲明一個abstract類的對象,該對象可以成為其子類對象的上轉型對象,也就可以調用子類重寫的方法了
6如果一個abstract類是一個abstract類的子類,那么他既可以繼承父類的abstract方法,也可以重寫父類的方法
下面總結一句話就是 抽象繼承抽象雙可(既可以繼承抽象方法,也可以重寫抽象方法)
非抽象繼承抽象單可(不可以繼承抽象方法,只可以重寫)
5.10面向抽象編程
什么是面向抽象編程:是指當設計某種重要的類的時候,不讓該類面向具體的類,而是面向抽象類,即設計類中的重要數據是抽象類聲明的對象,而不是具體類聲明的對象
ps:具體類,是指相對於抽象類而言說的,主要是指可以實現的類,可以直接生成實例的類,具有方法體,可以直接調用
額外
設計程序的時候應該注意滿足開-閉原則
怎么可以操作子類新增的成員變量?
子類新增方法 或 子類重寫方法
子類可以體現多態