怎樣理解封裝,繼承,多型!三者的區別?
阿新 • • 發佈:2019-02-16
1。類是對物件的一個抽象,同時類也為物件進行了封裝。所謂封裝是說類的設計者只是為使用者提供類 物件可以訪問的部分,而對於類中其他隱藏起來的成員變數 方法,使用者不能訪問。
實現方式:A:在類的定義中設定對物件中成員變數和方法進行訪問的許可權;
B:提供一個統一的供其他類引用的方法;
C:其它物件不能直接修改文字物件所擁有的屬性和方法。
2。訪問許可權:
A:private的成員變數和方法只能被這個類本身的方法訪問;
B:預設的成員變數和方法只被同一個包內的其它所有類都可訪問,包外不可;
C: protected的成員可以被這個類的本身、它的子類(同不同包均可)訪問;
D: public 完全公開。一個程式裡最多隻能有一個類被修飾為public,若程式中沒有任何public 類,且檔名是程式中的一個類名,則該類被視做public
注:不能用protected和private飾!!!!
3。類的繼承:
3.1 類繼承的實現:
A:java中Object類是java中所有類的祖宗!(P209)
兒子A extends 老爸------只能有一個老爸!
3.2 this和super:
this: this.資料成員 this.例項方法 this(引數)--引用本類中其他構造方法。
super:表示當前物件父類物件的引用
super.資料成員 super.例項方法 super(引數)--引用父類的構造方法。--通常在實現子 類的構造方法時,要先呼叫父類的構造方法!並且用來呼叫父類構造方法的super()必須放在子類構造方法的句首
3.3 初始化順序:
A 物件的初始化順序: 先靜態成員,再非靜態成員,再構造方法,
B 繼承中構造方法的呼叫順序: 先父類,再子類。
3.4 物件之間的型別轉換:
物件轉換的聖經:只能說貓是哺乳動物,不能說哺乳動物是貓!!!當說貓是哺乳動物時,貓將失掉貓獨有的屬性和行為!!!(作為貓時新增的成員變數和方法)
哺乳動物 aa=new 貓()---貓是哺乳動物(要通過IS-A測試)
4.千呼萬喚始出來------多型!
所謂多型就是同一方法獲得不同的行為特性!
分為:
A 編譯時多型性---過載 (引數個數不同或引數型別不同)
B 動態多型性----覆蓋( 改寫後的方法不能比覆蓋的方法有更嚴格的訪問許可權--只能更加開放& 改寫後的方法不能比被覆蓋的法產生更多的例外)
******************************************************************
放點小音樂吧!
**** ******* 第一曲 final:
1。final type 變數名=初值---常量
2。final 方法---該方法任何時候都不可以覆蓋,但可以被過載。
3。final 類 ----該類不能被繼承並覆蓋其內容。(像System類,String類)
第二曲 native: 本地引用說明符^@^
java允許在程式中直接引用本地機上非java語言編寫的程式。
native type programName([引數列表]);
programName是要引用的程式名,以方法的形式出現。由於是引用,具體執行的操作都包含在源程式中,所有programName後無具體方法體!
******************************************************************
一。深入繼承:
1》設計繼承樹:
(1)找出具有共同屬性和行為的物件(狼和狗與羊^^---動物共同的屬性)
(2)設計代表共同狀態與行為的類(都屬於動物!---父類)
(3)決定子類是否需要讓某項行為有特定不同運作的方式(都會吃,但羊只吃草---方法的覆蓋)
(4)通過尋找使用共同行為的子類找出更多抽象化的機會(狼和狗屬於犬科!!!--再繼承)
(5)檢查設計是否合理(IS-A)
(6)大功告成!
2》繼承的意義:
(1)避免了重複的程式碼(子類會時時響應父類的改變)
(2)定義出共同的協議(服務於多型^^)
?當定主義出一組類的父型時,你可以用子型的任何類來填補任何需要或期待父型的位置?
二。深入多型:
(1) class Vet{
public void giveShot(Animal a){
a.makeNoise();
}
}
class PetOwner{
public void start(){
Vet v=new Vet();
Dog d=new Dog();
Hippo h=new Hippo();
v.giveShot(d);
V.giveSHot(h);
}
}
在此例中如果用Animal型別來宣告它的引數(返回型別、陣列的型別),則程式程式碼就可以處理所有Animal的子類。這意味 著其它人只要注意到要擴充過Animal就可以利用你的Vet!(P168)
如果此例不用多型,那麼每一種動物都要寫出不同的方法--這是何等悲哀!!
(2)介面:
多型意味著“很多形式”,可以把兒子當作爸爸或爺爺!!
可以通過繼承來定義相關類間的共同協議(方法就是協議的標誌!),這樣就等同於在對其他程式程式碼宣告:“我所有的子類都能腸系用這些方法來執行這幾項工作!”
為了避免出現“致命方塊”所以java不允許出現多繼承,介面正是我們的救星!java介面是100% 的純抽象類。而且使用介面可以繼承一個以上的來源,同時其他類也可以實現同一個介面中。所以可以為不同的需求組合出不同的繼承層次!
三。如何判斷應該是設計類、子類、抽象類或介面呢?
(1)如果新類無法對其他的類通過IS-A測試時,就設計不繼承其他類的類。
(2)只有在需要某類的特殊化版本時,以覆蓋或增加新的方法來繼承現有的類。
(3)當你需要定義一群子類的模板,又不想讓其他人初始化此模版時,設計出抽象的類給他們用。
(4)如果想要只定義出類可以扮演的角色,使用介面。
實現方式:A:在類的定義中設定對物件中成員變數和方法進行訪問的許可權;
B:提供一個統一的供其他類引用的方法;
C:其它物件不能直接修改文字物件所擁有的屬性和方法。
2。訪問許可權:
A:private的成員變數和方法只能被這個類本身的方法訪問;
B:預設的成員變數和方法只被同一個包內的其它所有類都可訪問,包外不可;
C: protected的成員可以被這個類的本身、它的子類(同不同包均可)訪問;
D: public 完全公開。一個程式裡最多隻能有一個類被修飾為public,若程式中沒有任何public 類,且檔名是程式中的一個類名,則該類被視做public
注:不能用protected和private飾!!!!
3。類的繼承:
3.1 類繼承的實現:
A:java中Object類是java中所有類的祖宗!(P209)
兒子A extends 老爸------只能有一個老爸!
3.2 this和super:
this: this.資料成員 this.例項方法 this(引數)--引用本類中其他構造方法。
super:表示當前物件父類物件的引用
super.資料成員 super.例項方法 super(引數)--引用父類的構造方法。--通常在實現子 類的構造方法時,要先呼叫父類的構造方法!並且用來呼叫父類構造方法的super()必須放在子類構造方法的句首
3.3 初始化順序:
A 物件的初始化順序: 先靜態成員,再非靜態成員,再構造方法,
B 繼承中構造方法的呼叫順序: 先父類,再子類。
3.4 物件之間的型別轉換:
物件轉換的聖經:只能說貓是哺乳動物,不能說哺乳動物是貓!!!當說貓是哺乳動物時,貓將失掉貓獨有的屬性和行為!!!(作為貓時新增的成員變數和方法)
哺乳動物 aa=new 貓()---貓是哺乳動物(要通過IS-A測試)
4.千呼萬喚始出來------多型!
所謂多型就是同一方法獲得不同的行為特性!
分為:
A 編譯時多型性---過載 (引數個數不同或引數型別不同)
B 動態多型性----覆蓋( 改寫後的方法不能比覆蓋的方法有更嚴格的訪問許可權--只能更加開放& 改寫後的方法不能比被覆蓋的法產生更多的例外)
******************************************************************
放點小音樂吧!
**** ******* 第一曲 final:
1。final type 變數名=初值---常量
2。final 方法---該方法任何時候都不可以覆蓋,但可以被過載。
3。final 類 ----該類不能被繼承並覆蓋其內容。(像System類,String類)
第二曲 native: 本地引用說明符^@^
java允許在程式中直接引用本地機上非java語言編寫的程式。
native type programName([引數列表]);
programName是要引用的程式名,以方法的形式出現。由於是引用,具體執行的操作都包含在源程式中,所有programName後無具體方法體!
******************************************************************
一。深入繼承:
1》設計繼承樹:
(1)找出具有共同屬性和行為的物件(狼和狗與羊^^---動物共同的屬性)
(2)設計代表共同狀態與行為的類(都屬於動物!---父類)
(3)決定子類是否需要讓某項行為有特定不同運作的方式(都會吃,但羊只吃草---方法的覆蓋)
(4)通過尋找使用共同行為的子類找出更多抽象化的機會(狼和狗屬於犬科!!!--再繼承)
(5)檢查設計是否合理(IS-A)
(6)大功告成!
2》繼承的意義:
(1)避免了重複的程式碼(子類會時時響應父類的改變)
(2)定義出共同的協議(服務於多型^^)
?當定主義出一組類的父型時,你可以用子型的任何類來填補任何需要或期待父型的位置?
二。深入多型:
(1) class Vet{
public void giveShot(Animal a){
a.makeNoise();
}
}
class PetOwner{
public void start(){
Vet v=new Vet();
Dog d=new Dog();
Hippo h=new Hippo();
v.giveShot(d);
V.giveSHot(h);
}
}
在此例中如果用Animal型別來宣告它的引數(返回型別、陣列的型別),則程式程式碼就可以處理所有Animal的子類。這意味 著其它人只要注意到要擴充過Animal就可以利用你的Vet!(P168)
如果此例不用多型,那麼每一種動物都要寫出不同的方法--這是何等悲哀!!
(2)介面:
多型意味著“很多形式”,可以把兒子當作爸爸或爺爺!!
可以通過繼承來定義相關類間的共同協議(方法就是協議的標誌!),這樣就等同於在對其他程式程式碼宣告:“我所有的子類都能腸系用這些方法來執行這幾項工作!”
為了避免出現“致命方塊”所以java不允許出現多繼承,介面正是我們的救星!java介面是100% 的純抽象類。而且使用介面可以繼承一個以上的來源,同時其他類也可以實現同一個介面中。所以可以為不同的需求組合出不同的繼承層次!
三。如何判斷應該是設計類、子類、抽象類或介面呢?
(1)如果新類無法對其他的類通過IS-A測試時,就設計不繼承其他類的類。
(2)只有在需要某類的特殊化版本時,以覆蓋或增加新的方法來繼承現有的類。
(3)當你需要定義一群子類的模板,又不想讓其他人初始化此模版時,設計出抽象的類給他們用。
(4)如果想要只定義出類可以扮演的角色,使用介面。