歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java之多態的使用

     首先,什麼是多態?我們應該從什麼角度來理解多態?其實,我們不妨把多態理解成一種事物的多種存在形態,比如,貓和狗都可以變成動物,而動物又可以變成貓和狗。

      為了充分理解多態,我們可以從以下這幾個方面來理解多態。

      第一、從多態的體現方面:我們使用多態的時候,創建的是父類的引用,開辟的是子類的空間,由於沒有開辟父類的空間,所以是父類的引用指向子類對象,並不是真正的父類自己創建了對象,而且父類對象的引用還可以作為函數參數來接收子類對象哦!

    第二、多態實現的前提:必須是類與類之間要有關系,要麼繼承,要麼實現,存在覆蓋,其實就是有抽象函數。

    第三、從多態的好處:大大提高程序的可拓展性

    第四、多態的應用:1.父類對象的引用指向子類對象,其實本質上是一個向上轉型,就像int轉成double一樣,兒子穿了一身爸爸的衣服,扮成了爸爸。2.但變成了爸爸之後,只能使用爸爸特有的技能,兒子怎麼能夠使用自己本身的技能呢?這時候就需要向下轉型,脫下偽裝,將父類對象的引用強轉成子類類型,就可以使用子類特有的技能了。

    第五、多態的弊端:提高了拓展性,但是只能使用父類的引用訪問父類的成員。

------------------------------------------------------------------------------------------例子------------------------------------------------------------------------------------------------

/*
多態:可以理解為事物存在的多種體現形態。

人:男人,女人

動物:貓,狗。

貓 x = new 貓();

動物 x = new 貓();

1,多態的體現
    父類的引用指向了自己的子類對象。
    父類的引用也可以接收自己的子類對象。
2,多態的前提
    必須是類與類之間有關系。要麼繼承,要麼實現。
    通常還有一個前提:存在覆蓋。

3,多態的好處
    多態的出現大大的提高程序的擴展性。

4,多態的弊端:
    提高了擴展性,但是只能使用父類的引用訪問父類中的成員。

5,多態的應用

 

*/

/*
動物,
貓,狗。
*/

abstract class Animal
{
    abstract void eat();

}

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 DuoTaiDemo
{
    public static void main(String[] args)
    {
        //Cat c = new Cat();
        //c.eat();

        //Dog d = new Dog();
        //d.eat();
        //Cat c = new Cat();
        /*
        Cat c1 = new Cat();
        function(c1);

        function(new Dog());
        function(new Pig());
        */

        //Animal c = new Cat();
        //c.eat();

       
        function(new Cat());
        function(new Dog());
        function(new Pig());
       

       
    }
    public static void function(Animal a)//Animal a = new Cat();
    {
        a.eat();
        //a.catchMouse();
    }
    /*
    public static void function(Cat c)//
    {
        c.eat();
    }
    public static void function(Dog d)
    {
        d.eat();
    }

    public static void function(Pig p)
    {
        p.eat();
    }
    */

}

 

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/*
多態:可以理解為事物存在的多種體現形態。

人:男人,女人

動物:貓,狗。

貓 x = new 貓();

動物 x = new 貓();

1,多態的體現
    父類的引用指向了自己的子類對象。
    父類的引用也可以接收自己的子類對象。
2,多態的前提
    必須是類與類之間有關系。要麼繼承,要麼實現。
    通常還有一個前提:存在覆蓋。

3,多態的好處
    多態的出現大大的提高程序的擴展性。

4,多態的弊端:
    雖然提高了擴展性,但是只能使用父類的引用訪問父類中的成員。

5,多態的應用

6,多態的出現代碼中的特點(多態使用的注意事項)

 


第二個問題:如何使用子類特有方法。
*/

/*
動物,
貓,狗。
*/

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;
       

        /*
        畢姥爺 x = new 畢老師();

        x.講課();

        畢老師 y = (畢老師)x;


        y.看電影();
        */
        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();
        }


        /*
        instanceof : 用於判斷對象的類型。 對象 intanceof 類型(類類型 接口類型) 
        */
   
    }
   


}

Copyright © Linux教程網 All Rights Reserved