Java中的多型

2021-06-02 21:08:11 字數 2338 閱讀 2974

多型也就是乙個名字多中狀態,這就叫多型。

例如,人(老師,學生),老師和學生都是人,也就是人現在有兩種狀態。

多型有四種型別:

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...