多型也就是乙個名字多中狀態,這就叫多型。
例如,人(老師,學生),老師和學生都是人,也就是人現在有兩種狀態。
多型有四種型別:
1,基本型別的多型。例如, byte,int,double,float,long。例如2,我們可以把它當作int型別,byte型別,long型別,還可以把其當作double型別。2說成是double型別的時候,本質上是存在自動型別轉換的。
2,方法的多型(顯然,過載就是乙個最好的例子)。
3,類或者介面的多型。定義乙個父類的引用,讓這個引用指向乙個new出來的子類物件,這就是類或者介面的多型。
4,引數傳遞過程中的多型,這是最重要的一種,是引用型別和基本型別的結合使用。
多型主要用來設計方法的引數和返回值的型別。
類多型的前提條件是繼承(這也是繼承最重要的應用之一)。
person p = new student();
這句**在執行的時候,會在棧記憶體中放乙個person型別的引用,然後new乙個student物件,然後讓這個引用指向這個物件。這是典型的發生多型的乙個**。因為引用的型別和student物件的型別是不一樣的啊。棧和堆記憶體型別不相同的時候,究竟以誰作為真正的型別呢?sun公司是這樣規定的,我們把p當作父類的物件來用,即把子類的物件當做父類的物件來用。這樣就會發生乙個有趣的現象:
發生多型時候,父類中的定義的東西都可以使用,子類中定義的不能直接使用;
//發生多型時候 需要注意的幾點
public class student extends person
public void setid(int id)
public void test()
public static void test1()
public static void main(string args)
}public class person
public person(int age, string name)
public int getage()
public void setage(int age)
public string getname()
public void setname(string name)
public void test()
public static void test1()
}public class testcast if(p2 instanceof student)if(p2 instanceof person)if(p2 instanceof
student)if(p2 instanceof object)就是在記憶體中重新定義乙個子類型別的物件 //student s1 = (student)p1;//student s2 = (student)p2;//以上兩句在編譯時候不會報錯,但是確實存在非法的型別轉換,如何保證型別可以發生轉換呢?使用instanceof
關鍵字來判斷物件的型別}}
解決多型發生的時候,使用子類中的屬性和方法的問題。其實多型說得徹底一點就是型別轉換。由於發生多型的時候,我們建立的子類的物件賦值給父類的引用,這是我們把這個引用當作了父類的物件來用,但是建立子類物件時候,子類中的一些屬性和方法都是存在對記憶體當中。我們卻不能直接用這個父類的引用來訪問子類的一些屬性和方法。解決這個問題,我們引入了抽象型別的強制型別轉換。其實,發生多型時候,進行強制型別轉換是一種還原行為,即原來是什麼,還原成什麼。
引用型別的強制型別轉換只發生在子類與父類之間。(1)子類到父類的轉換屬於自動型別轉換;(2)父類到子類的型別轉換需要進行強制型別轉換。
person p1 = new person();person p2 = new student();
//student s1 = (student)p1; //記憶體中不存在的時候,這個轉換時一定不會成功的
//student s2 = (student)p2; //因為記憶體中存在getid(),所以可以發生型別轉換
正如上面發生強制型別轉換的兩句,在編譯的時候能通過,不會報錯和警告。第一句的強制型別轉換確實不是合法的。如何在才能保證強制型別轉換的正常進行呢?這裡引入instanceof關鍵字。這個關鍵字的作用是用來判斷物件的型別的(注意判斷的是物件的型別而非引用的型別,這是有區別的)。instanceof在判斷物件的型別的時候,是相容父類的,所以說,在判斷乙個物件的型別的時候,這時只告訴我們是否可以發生強制型別轉換,但是不能告訴我們物件確切的型別。
發生多型,子類重寫的時候,new出來的物件,在執行一些操作的時候。對應static方法是執行父類的,而非static方法則執行的是子類的。
java中的多型
下面乙個例子,可以很清楚的給大家講解什麼是多型 父類 public class baseclass public void test 子類 public class subclass extends baseclass public void sub 呼叫 public static void ma...
Java中的多型
多型 某一種事物的多種存在形態 1 體現 父類引用指向子類的物件,即父類f 子類z,f fu new z 2 好處 大大提高程式擴充套件性 3 前提 必須是繼承或實現關係 且存在覆蓋 4 弊端 只能訪問父類的成員 轉型 父類引用指向子類物件時,又想要使用子類中的方法,那 麼就需要將該父類引用強轉成指...
java中的多型
多型 晚繫結。不要把函式過載理解為多型。因為多型是一種執行期的行為,不是編譯期的行為。多型 父型別的引用可以指向子型別的物件。比如 parent p new child 當使用多型方式呼叫方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤 如果有,再去呼叫子類的該同名方法。注意此處,靜態sta...