目錄
多態(tài)?
重寫?
向上轉(zhuǎn)型
類的多態(tài)性例子:?
多態(tài)的優(yōu)缺點
?
多態(tài)?
所有的OOP語言都會有三個特征:
- 封裝(點擊可跳轉(zhuǎn))
- 繼承(點擊可跳轉(zhuǎn))
- 多態(tài)
多態(tài)體現(xiàn):在代碼運行時,當傳遞不同類對象時,會調(diào)用對應(yīng)類中的方法。
在java中要實現(xiàn)多態(tài),必須要滿足如下幾個條件,缺一不可:
- 必須在繼承體系下;
- 子類必須要對父類中方法進行重寫?;
- 通過父類的引用調(diào)用重寫的方法。
重寫?
繼承我們已經(jīng)知道了,那我們面臨的第一個問題就是什么是重寫?
重寫(override):也稱為覆蓋。重寫是子類對父類非靜態(tài)、非private修飾,非final修飾,非構(gòu)造方法等的實現(xiàn)過程進行重新編寫, 返回值(返回類型滿足父子關(guān)系也可以)和形參都不能改變。即外殼不變,核心重寫!
重寫的好處在于子類可以根據(jù)需要,定義特定于自己的行為。 也就是說子類能夠根據(jù)需要實現(xiàn)父類的方法。
注:避免在構(gòu)造方法中調(diào)用重寫的方法。
方法重寫的規(guī)則:
- 子類在重寫父類的方法時,一般必須與父類方法原型一致:方法名,參數(shù)列表要完全一致;
- 被重寫的方法返回值類型可以不同,但是必須是具有父子關(guān)系的;
- 訪問權(quán)限不能比父類中被重寫的方法的訪問權(quán)限更低。例如:如果父類方法被public修飾,則子類中重寫該方法就不能聲明為 protected,父類被static、private修飾的方法、構(gòu)造方法都不能被重寫;
- 重寫的方法, 可以使用 @Override 注解來顯式指定,有了這個注解能幫我們進行一些合法性校驗。例如不小心將方法名字拼寫錯了 (比如寫成 aet),那么此時編譯器就會發(fā)現(xiàn)父類中沒有 aet 方法,就會編譯報錯, 提示無法構(gòu)成重寫。
?此時我們已經(jīng)滿足兩點了還差最后一點。而第三點是通過父類的引用調(diào)用重寫的方法。而要實現(xiàn)這一點就必須進行向上轉(zhuǎn)型。
向上轉(zhuǎn)型
向上轉(zhuǎn)型就是為了實現(xiàn)代碼通過父類的引用調(diào)用重寫的方法。向上轉(zhuǎn)型其實很簡單
向上轉(zhuǎn)型:實際就是創(chuàng)建一個子類對象,將其當成父類對象來使用。
語法格式:父類類型 對象名 = new 子類類型()
向上轉(zhuǎn)型的使用場景:
- 直接賦值(上面的例子就是直接賦值)
- 方法傳參
- 方法返回
向上轉(zhuǎn)型的優(yōu)點:讓代碼實現(xiàn)更簡單靈活。
向上轉(zhuǎn)型的缺陷:不能調(diào)用到子類特有的方法。
使用了向上轉(zhuǎn)型之后就可以通過父類的引用調(diào)用重寫的方法,而不是重寫方法的就沒法調(diào)用。
class Animal{
public String name = "花花";
public void eat(){
System.out.println(this.name+"正在吃飯");
}
}
class Dog extends Animal{
@Override
public void eat(){
System.out.println(this.name+"在吃狗糧");
}
public void a(){
System.out.println("hhh");
}
}
public class Test {
public static void main(String[] args) {
Animal dog = new Dog();
dog.eat();
//打印花花在吃狗糧
Animal dog2 = new Animal();
dog2.eat();
//打印花花正在吃飯
}
}
類的多態(tài)性例子:?
class Animal{
public String name = "花花";
public void eat(){
System.out.println(this.name+"正在吃飯");
}
}
class Dog extends Animal{
@Override
public void eat(){
System.out.println(this.name+"在吃狗糧");
}
}
class Cat extends Animal{
@Override
public void eat(){
System.out.println(this.name+"在吃貓糧");
}
}
public class Test {
public static void fun(Animal arr){
arr.eat();
}
public static void main(String[] args) {
//數(shù)組的每個成員都會發(fā)生向上轉(zhuǎn)型
Animal[] arr = {new Dog(),
new Cat()};
//此時就會發(fā)現(xiàn)調(diào)用同一個方法fun()會有兩種結(jié)果
fun(arr[0]);
fun(arr[1]);
}
}
多態(tài)的優(yōu)缺點
- 能夠降低代碼的 "圈復(fù)雜度", 避免使用大量的 if - else;
什么叫 "圈復(fù)雜度" ?
圈復(fù)雜度是一種描述一段代碼復(fù)雜程度的方式。一段代碼如果平鋪直敘,那么就比較簡單容易理解。而如果有很多的條件分支或者循環(huán)語句,就認為理解起來更復(fù)雜;文章來源:http://www.zghlxwxcb.cn/news/detail-636235.html
因此我們可以簡單粗暴的計算一段代碼中條件語句和循環(huán)語句出現(xiàn)的個數(shù),這個個數(shù)就稱為 "圈復(fù)雜度"。如果一個方法的圈復(fù)雜度太高, 就需要考慮重構(gòu)。文章來源地址http://www.zghlxwxcb.cn/news/detail-636235.html
- 可擴展能力更強;
- 多態(tài)缺陷:代碼的運行效率降低。
到了這里,關(guān)于類的多態(tài)性(JAVA)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!