天天看點

黑馬程式員——關于多态

 ---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO開發S</a>、<a href="http://edu.csdn.net"target="blank">.Net教育訓練</a>、期待與您交流! ----------------------

3.11 多态

   1、多态的展現:父類的引用指向了自己的子類對象,

   2、好處:大大提高程式的擴充性

   3、前提:必須有關系:繼承,接口.必須存在覆寫

   4、弊端:雖提高了擴充性,但是隻能使用父類的引用通路父類中的成員

   5、多态的應用:

   6、多态時,成員的特點

      1)、成員函數:在編譯時,參閱引用型變量中所屬的類中的是否有調用的成員變量,有,編譯通過,否則,失敗。在運作時,參閱對象所屬的類中是否有調用的方法

簡單總結:成員函數在多态調用時,編譯看左邊,運作看右邊

    以下注意面試題

      2)、成員變量:無論編譯,還是運作都參考引用型變量中所屬的類中的是否有調用的成員變量,有,編譯通過,否則,失敗。即左邊

      3)、靜态函數:從某種意義上講,不涉及多态。

  7、代碼示例:

abstract class Animal{
abstract void eat();
}
class Cat extends Animal{
void catchMouse(){
System.out.println("抓老鼠");
}
void eat() {
System.out.println("吃魚");
}
}
class Dog extends Animal{
void watchHome(){
System.out.println("看家");
}
void eat() {
System.out.println("吃骨頭");
}
}
class Pig extends Animal{
void watchHome(){
System.out.println("看家");
}
void eat() {
System.out.println("飼料");
}
}
public class AboutPolymorphic {
public static void main(String[] args) {
/* Cat c = new Cat();
c.eat();
Dog d = new Dog();
d.eat();
Pig p = new Pig();
//為了提高以上代碼的複用性,于是将eat功能提取出來寫成function函數
function(c);
function(d);
function(p);
//可是當我們要擴充功能,比如加個pig,這樣的話有得寫function功能,可是function函數都一樣,為了提高代碼的複用性
*/
//一個事物的多種存在形态
// Animal a = new Cat(); //類型提升,向上轉型
//c.eat();
//Cat c = (Cat)a;
//如果想要調用貓的特有方法,強制将父類的引用,轉換成子類類型,即向下轉型
/*注意:①千萬不要出現這樣的操作,就是将父類對象轉換子類類型。
②我們能轉換的是父類應用指向了自己的子類對象時,該應用可以被提升,也可以被強制轉換。
③多态自始至終都是子類對象在做着變化
*/
//c.catchMouse();
function(new Cat());
function(new Dog());
function(new Pig());
}
public static void function(Animal a){
a.eat();
if(a instanceof Cat){//類型判斷:instanceof
//作用:用于判斷對象的具體類型,隻能用于引用資料類型判斷,以及在向下轉型前用于健壯性的判斷
Cat c = (Cat)a;
c.catchMouse();
}else if(a instanceof Dog){
Dog d = (Dog)a;
d.watchHome();
}
}
/*public static void function(Cat c){
c.eat();
}
public static void function(Dog d){
d.eat();
}
public static void function(Pig p){
p.eat();
}*/
}      

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS開發</a>、<a href="http://edu.csdn.net"target="blank">.Net教育訓練</a>、期待與您交流! ---------------------- 

繼續閱讀