——- android教育訓練、java教育訓練、期待與您交流! ———-
Java多态
一、多态的概念
多态:可以了解為事物存在的多種展現形态。
人:男人,女人
動物:貓,狗。
貓 x = new 貓();
動物 x = new 貓();
二、多态的展現
- 父類的引用指向了自己的子類對象。
- 父類的引用也可以接收自己的子類對象。
- instanceof : 用于判斷對象的類型。 對象 intanceof 類型(類類型 接口類型)
-
千萬不要出現這樣的操作,就是将父類對象轉成子類類型。我們能轉換的是父類應用指向了自己的子類對象時,該應用可以被提升,也可以被強制轉換。多态自始至終都是子類對象在做着變化。
示例如下:
class Cat extends Animal
{
public void eat()
{
System.out.println("吃魚");
}
public void catchMouse()
{
System.out.println("抓老鼠");
}
}
class Dog extends Animal
{
public void eat()
{
System.out.println("吃骨頭");
}
public void kanJia()
{
System.out.println("看家");
}
}
class Pig extends Animal
{
public void eat()
{
System.out.println("飼料");
}
public void gongDi()
{
System.out.println("拱地");
}
}
//-----------------------------------------
class DuoTaiDemo2
{
public static void main(String[] args)
{
//Animal a = new Cat();//類型提升。 向上轉型。
//a.eat();
//如果想要調用貓的特有方法時,如何操作?
//強制将父類的引用。轉成子類類型。向下轉型。
///Cat c = (Cat)a;
//c.catchMouse();
Animal a = new Animal();
Cat c = (Cat)a;
function(new Dog());
function(new Cat());
}
public static void function(Animal a)//Animal a = new Cat();
{
a.eat();
/*
if(a instanceof Animal)
{
System.out.println("haha");
}
else
*/
if(a instanceof Cat)
{
Cat c = (Cat)a;
c.catchMouse();
}
else if(a instanceof Dog)
{
Dog c = (Dog)a;
c.kanJia();
}
}
}
三、多态的前提
- 必須是類與類之間有關系。要麼繼承,要麼實作。
- 通常還有一個前提:存在覆寫。
四、多态的好處
- 多态的出現大大的提高程式的擴充性。
五、多态的弊端
- 雖然提高了擴充性,但是隻能使用父類的引用通路父類中的成員。
六、多态的特點
在多态中成員函數的特點:
- 在編譯時期:參閱引用型變量所屬的類中是否有調用的方法。如果有,編譯通過,如果沒有編譯失敗。
- 在運作時期:參閱對象所屬的類中是否有調用的方法。
簡單總結就是:成員函數在多态調用時,編譯看左邊,運作看右邊。
在多态中,成員變量的特點:
無論編譯和運作,都參考左邊(引用型變量所屬的類)。
在多态中,靜态成員函數的特點:
無論編譯和運作,都參考做左邊。
六、多态的應用
需求:
電腦運作執行個體,
電腦運作基于主機闆。
如圖所示,設計一個PCI接口,讓網卡,聲霸卡等裝置實作PCI,利用多态就可以滿足需求,提高了主機闆的可擴充性!
interface PCI
{
public void open();
public void close();
}
class MainBoard
{
public void run()
{
System.out.println("mainboard run ");
}
public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子類對象。
{
if(p!=null)
{
p.open();
p.close();
}
}
}
class NetCard implements PCI
{
public void open()
{
System.out.println("netcard open");
}
public void close()
{
System.out.println("netcard close");
method();
}
}
class SoundCard implements PCI
{
public void open()
{
System.out.println("SoundCard open");
}
public void close()
{
System.out.println("SoundCard close");
}
}
/*
class MainBoard
{
public void run()
{
System.out.println("mainboard run");
}
public void useNetCard(NetCard c)
{
c.open();
c.close();
}
}
class NetCard
{
public void open()
{
System.out.println("netcard open");
}
public void close()
{
System.out.println("netcard close");
}
}
*/
class DuoTaiDemo5
{
public static void main(String[] args)
{
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(null);
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());
}
}