(1)概念
單態:這個物件只有唯一的一種狀態
student s = new student();
多型:這個物件存在多種狀態。 是指同一行為,具有多個不同表現形式。
(2)多型實現的前提
1)要有繼承或者實現的關係
2)方法的重寫(如果沒有方法重寫,格式不會報錯,這樣的多型是沒有任何意義)
3)父類的引用指向子類物件(父new子)或者父介面的引用指向實現類物件(父介面new實現類)
(1)多型體現的格式
父類型別 變數名 = new 子類物件();
變數名.方法名();
eg:animal dog = new dog();
dog.eat();
(2)多型思想下成員的特點
1)例項變數
物件被什麼資料型別所修飾,這個變數就會呼叫誰的例項變數
//父類:superclass
public class superclass
//子類:subclass
public class subclass extends superclass
//測試類:polydemo02
public class polydemo02
}
2)例項方法
先看父類中是否有這個方法,如果有,執行子類重寫後的方法;如果沒有,編譯報錯
//父類:superclass
public class superclass
}
//子類:subclass
public class subclass extends superclass
}
//測試類:polydemo04
public class polydemo04
}
3)構造器
和原來一樣
//父類:superclass
public class superclass
}
//子類:subclass
public class subclass extends superclass
}
//測試類polydemo03
public class polydemo03
}
(1)多型的好處//student類
public class student
public void setname(string name)
public int getage()
public void setage(int age)
//設定滿參構造器
public student(string name, int age)
//重寫系統中自帶的tostring方法
@override
public string tostring()
}
//測試類:polydemo05
public class polydemo05 ;
printarr(arr);
} //object為頂級父類,將其放置形參
private static void printarr(object arr)
}}
//執行結果
student [name=張三, age=18]
student [name=李四, age=23]
student [name=錢五, age=43]
student [name=孫六, age=23]
(2)多型的弊端及解決辦法
1)多型的弊端
在多型的情況下,物件無法呼叫自己的特有方法,只能呼叫子類改寫父類的方法。
2)多型的解決方法
解決多型的弊端,引用資料型別的型別轉換
型別轉換名稱
型別轉換方向
向上轉型(預設轉換方式)
將子類的物件或者實現類的物件轉換為父類的型別或者父介面型別(多型)
向下轉型(強制型別轉換)
將父類型別或者父介面型別轉換為子類型別或者實現類型別
子類型別 物件名 = (子類型別)父類型別的物件;
eg:animal cat = new cat(); //多型
dog dog = (dog)cat; //強轉
3)instanceof關鍵字的引入
強制轉換時易發生型別轉換異常,使用instanceof給引用變數做型別的校驗
變數名 instanceof 資料型別
eg:c instanceof cat
1.定義動物類
屬性:年齡,顏色
行為:eat(string something)方法(無具體行為,不同動物吃的方式和東西不一樣,
something表示吃的東西)生成空參有參構造,set和get方法
2.定義狗類繼承動物類
行為:eat(string something)方法,看家lookhome方法(無引數)
3.定義貓類繼承動物類
行為:eat(string something)方法,逮老鼠catchmouse方法(無引數)
4.定義person類
屬性:姓名,年齡
行為:keeppet(dog dog,string something)方法
功能:餵養寵物狗,something表示餵養的東西
行為:keeppet(cat cat,string something)方法
功能:餵養寵物貓,something表示餵養的東西
實現以上兩種行為,思考如何只寫乙個方法?
生成空參有參構造,set和get方法
5.測試以上方法
使用多型、強轉、instanceof等
//animal類
public abstract class animal
public void setage(int age)
public string getcolor()
public void setcolor(string color)
//設定無參構造器和滿參構造器
public animal(int age, string color)
public animal()
//設定動物類的抽象方法
public abstract void eat(string something);
}
//cat類 繼承 animal類
public class cat extends animal
//逮老鼠方法
public void catchmouse ()
//設定構造器
public cat()
public cat(int age, string color)
}
//dog類 繼承 animal類
public class dog extends animal
public void lookhome()
//設定構造器
public dog()
public dog(int age, string color)
}
//person類
public class person
// 餵養貓的方法
public void keeppet(cat cat,string something) */
public void keeppet (animal a,string something)
}
//測試類:
public class polydemo06
//cat物件不屬於dog,判斷返回false
if (cat instanceof dog)
//cat c = (cat)dog;
system.out.println("***************===");
// 呼叫飼養員餵養狗的方法
p.keeppet(dog, "骨頭");
}}
day12 物件導向 介面
package com.oop.demo11 抽象思維 inte ce 定義的關鍵字,介面需要實現類 public inte ce userservice package com.oop.demo11 public inte ce timeservice package com.oop.demo11...
day12 物件導向 this super 繼承
this表示當前物件,主要存在於兩個位置 構造器中 就表示當前建立的物件.方法中 哪乙個物件呼叫this所在的方法,那麼此時this就表示哪乙個物件.當乙個物件建立之後,jvm會分配乙個引用自身的引用 this.使用this場景 解決成員變數和引數 區域性變數 之間的二義性,必須使用 一般set方法...
Day12 物件導向的三大特性之多型
當中體現多型性,其實就是一句話 父類引用指向子類物件。格式 父類名稱物件名 new子類名稱 或者 介面名稱物件名 new實現類名稱 多型注意事項 1.多型是方法的多型,屬性沒有多型 2.需要有繼承關係 如果轉換無關係型別,就會有型別轉換異常 classcastexception 3.存在條件 不能被...