㈠ java多態怎麼理解
多態你可以從字面上去理解,一個類表現出多種形態。它是一種編碼的技巧而不是寫代碼的格式或者方式。 要想理解多態你需要從需求入手。偽代碼例子:void method(Father instance): instance.callmethod();現在有兩個子類 girl 和 boy . 如果我傳入給method的對象是girl,那麼instance.callmethod()是否就等同於girl.callmethod(),如果傳入的是boy,就等同於boy.callmethod().但是對於程序而言,表達式一直都是 void method(Father instance): instance.callmethod();沒有改變過只不過通過傳入不同的子類對象使這樣一個表達式表現出了多種「類的形態」。這樣的現象就叫做多態。 多態在軟體結構設計上是非常重要的一個抽象意識1:多態用於解決if,else 現代的編程技巧要求對於某一個函數專注於解決一類型的事情。這就要求一個函數中要盡量的避免出現>1個if,那麼如果程序出現了分支而又要避免使用if應該怎麼辦呢。那就是多態最經常出現的場景。看下面的一個2:多態用於隱藏函數的具體內容在面向對象高度結構化的開發中,軟體根據功能的不同需要分為各種模塊分別交給不同的人開發。那麼如果同一個介面描述一類情況顯然是非常高明的。最明顯的例子就是大家最常用的System,out.println(Object).初學者可能每天都在使用這樣一個多態,但是卻不知道這個是多態。System,out.println();無論你輸入的是一個string,object,int,array,float都可以正常輸出內容。為什麼,因為所有的你string,Intege,array,Float都是Object的子類,根據填入參數的類型,System,out,println()就表現出了各種輸出功能的形態。 說了這么多希望你能夠理解。 多態可以通過介面和繼承來實現。 一個介面可以對應多個實現 (1vN : 多態的數學描述,1個形態代表多個形態)繼承:一個父類可以有多個子類 (1vN : 多態的數學描述,1個形態代表多個形態)
㈡ java中多態性什麼意思
多態性:顧名思義就是擁有「多種形態」的含義,是指屬性或方法在子類中表現為多種形態。
在JAVA中有兩種多態是指:運行時多態和編譯時多態。多態性是面向對象的核心特徵之一,類的多態性提供類中成員設計的靈活性和方法執行的多樣性。
多態指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而採用多種不同的行為方式。(發送消息就是函數調用)
實現多態的技術稱為:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。
擴展資料:
多態的好處:
1、可替換性(substitutability)多態對已存在代碼具有可替換性。例如,多態對圓Circle類工作,對其他任何圓形幾何體,如圓環,也同樣工作。
2、可擴充性(extensibility)多態對代碼具有可擴充性。增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。實際上新加子類更容易獲得多態功能。
3、介面性(interface-ability)多態是超類通過方法簽名,向子類提供了一個共同介面,由子類來完善或者覆蓋它而實現的。
4、靈活性(flexibility)它在應用中體現了靈活多樣的操作,提高了使用效率。
5、簡化性(simplicity)多態簡化對應用軟體的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤為突出和重要。
㈢ java中多態具體是什麼
首先表明觀點,重載不是java多態的一種體現。
java的多態是指在程序運行過程中由虛擬機確定到底該使用哪種形態完成指定行為的一個過程。如下:
Parent p = new Son();
p.speak();
如果在Son中對父類speak()方法進行了重寫,那麼當你代碼寫到這里時,編譯器是不知道要執行Parent中的speak()還是Son中的speak()方法的,編譯器只知道這樣寫不會發生語法錯誤;只有在運行過程中才會根據實際在內存中(堆)創建的對象去執行相應的方法
如果重載是多態,那我問你,當你在代碼中寫上某個重載的方法後,此時編譯器不是已經確定了到底是哪個方法在完成你的功能嗎?這僅僅是編譯期,程序還沒有運行呢。
我還看到一些關於多態的其他說法,比如:編譯時多態,運行時多態。而這種觀點普遍認為重載就是多態體現的一種,因為重載算是編譯時多態,而運行時多態中就是我上面寫的那個例子。
借用一句《Java編程思想》作者Bruce Eckel的話:"不要犯傻,如果它不是晚綁定,它就不是多態"。這里的晚綁定就是指動態綁定,早綁定就是指靜態綁定,也就是所謂的重載。
具體如何理解,網上關於這方面的討論一大堆,各位自行參考。
㈣ java中的多態指什麼,如何理解
1、通過將子類對象引用賦值給超類對象引用變數來實現動態方法調用。
DerivedC c2=new DerivedC();
BaseClass a1= c2; //BaseClass 基類,DerivedC是繼承自BaseClass的子類
a1.play(); //play()在BaseClass,DerivedC中均有定義,即子類覆寫了該方法
分析:
* 為什麼子類的類型的對象實例可以覆給超類引用?
自動實現向上轉型。通過該語句,編譯器自動將子類實例向上移動,成為通用類型BaseClass;
* a.play()將執行子類還是父類定義的方法?
子類的。在運行時期,將根據a這個對象引用實際的類型來獲取對應的方法。所以才有多態性。一個基類的對象引用,被賦予不同的子類對象引用,執行該方法時,將表現出不同的行為。
在a1=c2的時候,仍然是存在兩個句柄,a1和c2,但是a1和c2擁有同一塊數據內存塊和不同的函數表。
2、不能把父類對象引用賦給子類對象引用變數
BaseClass a2=new BaseClass();
DerivedC c1=a2;//出錯
在java裡面,向上轉型是自動進行的,但是向下轉型卻不是,需要我們自己定義強制進行。
c1=(DerivedC)a2; 進行強制轉化,也就是向下轉型.
3、記住一個很簡單又很復雜的規則,一個類型引用只能引用引用類型自身含有的方法和變數。
你可能說這個規則不對的,因為父類引用指向子類對象的時候,最後執行的是子類的方法的。
其實這並不矛盾,那是因為採用了後期綁定,動態運行的時候又根據型別去調用了子類的方法。而假若子類的這個方法在父類中並沒有定義,則會出錯。
例如,DerivedC類在繼承BaseClass中定義的函數外,還增加了幾個函數(例如 myFun())
分析:
當你使用父類引用指向子類的時候,其實jvm已經使用了編譯器產生的類型信息調整轉換了。
這里你可以這樣理解,相當於把不是父類中含有的函數從虛擬函數表中設置為不可見的。注意有可能虛擬函數表中有些函數地址由於在子類中已經被改寫了,所以對象虛擬函數表中虛擬函數項目地址已經被設置為子類中完成的方法體的地址了。
㈤ java中的多態怎麼理解
多太就是,現實中的東西具有相同的行為,但行為的內部實現邏輯卻不相同。舉個例子,就如汽車會跑,但是有的汽車是前輪驅動,有的是後輪驅動。再譬如,足球場上的進球,可以抽射進球,也可以任意球,還可以點球。
㈥ 怎麼理解JAVA中的多態性
一、基本概念
多態性:發送消息給某個對象,讓該對象自行決定響應何種行為。
通過將子類對象引用賦值給超類對象引用變數來實現動態方法調用。
java 的這種機制遵循一個原則:當超類對象引用變數引用子類對象時,被引用對象的類型而不是引用變數的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。
1. 如果a是類A的一個引用,那麼,a可以指向類A的一個實例,或者說指向類A的一個子類。
2. 如果a是介面A的一個引用,那麼,a必須指向實現了介面A的一個類的實例。
二、Java多態性實現機制
SUN目前的JVM實現機制,類實例的引用就是指向一個句柄(handle)的指針,這個句柄是一對指針:
一個指針指向一張表格,實際上這個表格也有兩個指針(一個指針指向一個包含了對象的方法表,另外一個指向類對象,表明該對象所屬的類型);
另一個指針指向一塊從java堆中為分配出來內存空間。
The Java Virtual Machine does not require any particular internal structure for objects. In Sun 's current implementation of the Java Virtual Machine, a reference to a class instance is a pointer to a handle that is itself a pair of pointers: one to a table containing the methods of the object and a pointer to the Class object that represents the type of the object, and the other to the memory allocated from the Java heap for the object data. (jvm規范中關於對象內存布局的說明)
三、總結
1、通過將子類對象引用賦值給超類對象引用變數來實現動態方法調用。
DerivedC c2=new DerivedC();
BaseClass a1= c2; //BaseClass 基類,DerivedC是繼承自BaseClass的子類
a1.play(); //play()在BaseClass,DerivedC中均有定義,即子類覆寫了該方法
分析:
* 為什麼子類的類型的對象實例可以覆給超類引用?
自動實現向上轉型。通過該語句,編譯器自動將子類實例向上移動,成為通用類型BaseClass;
* a.play()將執行子類還是父類定義的方法?
子類的。在運行時期,將根據a這個對象引用實際的類型來獲取對應的方法。所以才有多態性。一個基類的對象引用,被賦予不同的子類對象引用,執行該方法時,將表現出不同的行為。
在a1=c2的時候,仍然是存在兩個句柄,a1和c2,但是a1和c2擁有同一塊數據內存塊和不同的函數表。
2、不能把父類對象引用賦給子類對象引用變數
BaseClass a2=new BaseClass();
DerivedC c1=a2;//出錯
在java裡面,向上轉型是自動進行的,但是向下轉型卻不是,需要我們自己定義強制進行。
c1=(DerivedC)a2; 進行強制轉化,也就是向下轉型.
3、記住一個很簡單又很復雜的規則,一個類型引用只能引用引用類型自身含有的方法和變數。
你可能說這個規則不對的,因為父類引用指向子類對象的時候,最後執行的是子類的方法的。
其實這並不矛盾,那是因為採用了後期綁定,動態運行的時候又根據型別去調用了子類的方法。而假若子類的這個方法在父類中並沒有定義,則會出錯。
例如,DerivedC類在繼承BaseClass中定義的函數外,還增加了幾個函數(例如 myFun())
分析:
當你使用父類引用指向子類的時候,其實jvm已經使用了編譯器產生的類型信息調整轉換了。
這里你可以這樣理解,相當於把不是父類中含有的函數從虛擬函數表中設置為不可見的。注意有可能虛擬函數表中有些函數地址由於在子類中已經被改寫了,所以對象虛擬函數表中虛擬函數項目地址已經被設置為子類中完成的方法體的地址了。
㈦ 對Java中多態的理解
多態用於繼承和介面情況下。。。比方說你是person的子類,那麼你本身就是person
在java中,多態大致可以分為以下幾種情況:
1.person為父類,student為子類。那麼:person p=new student();
2.fliable為介面,bird為實現介面的類,那麼:fliable f=new bird();
3.fliable為抽象類,bird為繼承fliable的類,那麼:fliable f=new bird();
具體可以看我的博客http://greenyouyou.blog.163.com/blog/static/138388147201010861035709/
㈧ java的多態怎麼理解啊,多態有什麼用途。
多態你可以從字面上去理解,一個類表現出多種形態。它是一種編碼的技巧而不是寫代碼的格式或者方式。 要想理解多態你需要從需求入手。偽代碼例子:void method(Father instance): instance.callmethod();現在有兩個子類 girl 和 boy . 如果我傳入給method的對象是girl,那麼instance.callmethod()是否就等同於girl.callmethod(),如果傳入的是boy,就等同於boy.callmethod().但是對於程序而言,表達式一直都是 void method(Father instance): instance.callmethod();沒有改變過只不過通過傳入不同的子類對象使這樣一個表達式表現出了多種「類的形態」。這樣的現象就叫做多態。 多態在軟體結構設計上是非常重要的一個抽象意識1:多態用於解決if,else 現代的編程技巧要求對於某一個函數專注於解決一類型的事情。這就要求一個函數中要盡量的避免出現>1個if,那麼如果程序出現了分支而又要避免使用if應該怎麼辦呢。那就是多態最經常出現的場景。看下面的一個2:多態用於隱藏函數的具體內容在面向對象高度結構化的開發中,軟體根據功能的不同需要分為各種模塊分別交給不同的人開發。那麼如果同一個介面描述一類情況顯然是非常高明的。最明顯的例子就是大家最常用的System,out.println(Object).初學者可能每天都在使用這樣一個多態,但是卻不知道這個是多態。System,out.println();無論你輸入的是一個string,object,int,array,float都可以正常輸出內容。為什麼,因為所有的你string,Intege,array,Float都是Object的子類,根據填入參數的類型,System,out,println()就表現出了各種輸出功能的形態。 說了這么多希望你能夠理解。 多態可以通過介面和繼承來實現。 一個介面可以對應多個實現 (1vN : 多態的數學描述,1個形態代表多個形態)繼承:一個父類可以有多個子類 (1vN : 多態的數學描述,1個形態代表多個形態)