黑馬程序員——java第八天:面向對象(多態、Object-equals&-toString)

------- android培訓java培訓、期待與您交流! ---------- 

多態:

定義:某一類事物的多種存在形態。

例:動物中貓,狗。

貓這個對象對應的類型是貓類型

x = new();

同時貓也是動物中的一種,也可以把貓稱爲 動物。

動物y = new();//向上轉型

動物是貓和狗具體事物中抽取出來的父類型。

父類型引用指向了子類對象。

1、 多態的體現:

父類的引用指向了自己的子類對象。

父類的引用也可以接收自己的子類對象。

2多態的前提

         必須是類與類之間有關係。要麼繼承,要麼實現。

         通常還有一個前提:存在覆蓋。

3多態的好處

         多態的出現大大的提高程序的擴展性。

4多態的弊端:

         雖然提高了擴展性,但是隻能使用父類的引用訪問父類中的成員。

如何使用子類特有方法­(轉型)?

publicclass DuoTaiDemo {

       publicstaticvoid 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());

       }

       publicstaticvoid function(Animal a)//Animal a = new Cat();

       {

           a.eat();//因爲父類中只有eat方法,所以正多態中只能調用這個方法。

           /*

           if(a instanceof Animal)//這個判斷不管a是誰(Cat、Dog、Pig)都是正確的true

           {

              System.out.println("haha");

           }          

           */

           if(a instanceof Cat)

           {

Cat c = (Cat)a;//通過向下轉型,轉爲子類引用,就可以用子類特有方//法了

              c.catchMouse();

           }

           elseif(a instanceof Dog)

           {

              Dog c = (Dog)a;

              c.kanJia();

           }

           /*

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

           */

       }

}

abstractclass Animal{

    publicabstractvoid eat();

}

class Cat extends Animal{

    publicvoid eat(){

       System.out.println("喫魚");

    }

    publicvoid catchMouse(){

       System.out.println("抓老鼠");

    }

}

class Dog extends Animal{

    publicvoid eat(){

       System.out.println("啃骨頭");

    }

    publicvoid kanJia(){

       System.out.println("看家");

    }

}

class Pig extends Animal{

    publicvoid eat(){

       System.out.println("飼料");

    }

    publicvoid gongdi(){

       System.out.println("拱地");

    }

}


 

 

例子:

/*

基礎班學生:

        學習,睡覺。

高級班學生:

        學習,睡覺。

 

可以將這兩類事物進行抽取。

 

*/

 

abstract class Student

{

         publicabstract void study();

         publicvoid sleep()

         {

                   System.out.println("躺着睡");

         }

}

 

class DoStudent

{

         publicvoid doSome(Student stu)

         {

                   stu.study();

                   stu.sleep();

         }

}

 

class BaseStudent extends Student

{

         publicvoid study()

         {

                   System.out.println("basestudy");

         }

         publicvoid sleep()

         {

                    System.out.println("坐着睡");

         }

}

 

class AdvStudent extends Student

{

         publicvoid study()

         {

                   System.out.println("adv study");

         }

}

class DuoTaiDemo3

{

         publicstatic void main(String[] args) 

         {

                   DoStudentds = new DoStudent();

                   ds.doSome(newBaseStudent());

                   ds.doSome(newAdvStudent());

 

                   

//               BaseStudentbs = new BaseStudent();

//               bs.study();

//               bs.sleep();

//               AdvStudentas = new AdvStudent();

//               as.study();

//               as.sleep();

         }

}


 

 

 

多態成員的特點:

1、成員函數(非靜態):編譯時:要查看引用變量所屬的類中是否有所調用的成員。

在運行時:要查看對象所屬的類中是否有所調用的成員。

終而言之:成員函數在多態調用時,編譯看左邊,運行看右邊

2、 成員變量:只看引用變量所屬的類。

3、 在多態中,靜態成員函數的特點:

不論編譯和運行都參考左邊(引用型變量所屬的類)

package e1;

 

class Fu

{

     intnum = 5;

    staticintnum1 = 3;

    void method1()

    {

       System.out.println("fumethod_1");

    }

    void method2()

    {

       System.out.println("fumethod_2");

    }

    staticvoid method4()

    {

       System.out.println("fumethod_4");

    }

}

 

 

class Zi extends Fu

{

    intnum = 8;

    staticintnum1 = 6;

    void method1()

    {

       System.out.println("zimethod_1");

    }

    void method3()

    {

       System.out.println("zimethod_3");

    }

 

    staticvoid method4()

    {

       System.out.println("zimethod_4");

    }

}

publicclass  DuoTaiDemo4

{

    publicstaticvoid main(String[] args) 

    {      

//     Fu f = new Zi();//2、在多態中,成員變量特點:

//     System.out.println(f.num);

//     Zi z = new Zi();

//     System.out.println(z.num);

 

       //f.method1();//1、在多態中,成員函數(非靜態)特點:

       //f.method2();

       //f.method3();

 

       Fu f = new Zi();//3、在多態中,靜態成員函數的特點:

       System.out.println(f.num1);

       f.method4();

       Zi z = new Zi();

       z.method4();

       

//     Zi z = new Zi();

//     z.method1();

//     z.method2();

//     z.method3();

    }

}   


 

 

Object類—equals()

equals(Object b);比較的是地址值。實現其他比較功能要子類覆寫。

Object類中已經提供了對對象是否相同的比較方法。如果自定義類中也有比較相同的功能,沒有必要重新定義,只需要沿襲父類中的功能,建立自己特有比較內容即可——覆蓋。

class Demo //extends Object

{

         private int num;

         Demo(int num)

         {

                   this.num = num;

         }

         

         public booleanequals(Object obj)//Object obj = new Demo();

         {

 

                   if(!(objinstanceof Demo))

                            returnfalse;

                   Demo d =(Demo)obj;

 

                   return this.num== d.num;

         }

         

         /*

         public booleancompare(Demo d)

         {

                   returnthis.num==d.num;

         }

         */

         public String toString()

         {

                   return"demo:"+num;

         }

 

 

}

class Person 

{

}

 

 

class ObjectDemo 

{

         public static voidmain(String[] args) 

         {

                   Demo d1 = newDemo(4);

                   System.out.println(d1);//輸出語句打印對象時,會自動調用對象的toString方法。打印對象的字符串表現形式。

                   Demo d2 = newDemo(7);

                   System.out.println(d2.toString());

                   //Demo d2 = newDemo(5);

                   //Class c =d1.getClass();

//

//               System.out.println(c.getName());

//               System.out.println(c.getName()+"@@"+Integer.toHexString(d1.hashCode()));

//               System.out.println(d1.toString());

                   //Person p =new Person();

                   ///System.out.println(d1.equals(p));

 

         }

}


 

 

ObjecttoString()

任意對象都可以轉爲字符串,toString()方法返回一個字符串,該字符串由類名、@、和此對象哈希值的無符號十六進制組成。

返回的字符串等於“getClass().getName()+@+IntegertoHexStringhashCode())”組成。

------- android培訓java培訓、期待與您交流! ----------詳細請查看:http://edu.csdn.net 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章