導航:首頁 > 編程語言 > java的多態機制是什麼

java的多態機制是什麼

發布時間:2023-03-25 12:05:18

1. java中多態性什麼意思

java中多態性的意思是作為面向對象的程序設計語言最核心的特徵,表示一個對象有著多重特徵,可以在特定的情況下表現出不同的狀態,從而對應著不同的屬性和方法。

1、就java而言,多態性就是允許將父對象設置成為一個或更多與自身子對象相等蘆備的技術,賦值之後父對象就可以根據當前賦值給自身子對象的特性以不同的方式運作。

2、據了解,java中多態性可以把不同的子類對象都當作父類來看,從而屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。

(1)java的多態機制是什麼擴展閱讀

java中多態性的注意事項

1、java中多態性使程序定義引用變數所陪空毀指向的具體類型和通過該引用變數發出的方法調用在編程時並不確定,而是在程序運行期間才確定,即一個引用變數倒底會指向哪個類的實例對象,該引用變數發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。

2、由此看來,java中多態性是在程序運行時才確定具體的類的,這樣就不用修改源程序代碼,當然也就可以讓引用變數綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態。虧殲

2. Java中的多態機制(有關成員變數的)

java中,向上造型呈現搜譽核的多態性僅僅針對成員函世掘數,成員屬性不具有多態性,例如:
Father fs = new Son();
fs.m1(); //調用的是子類的函數
fs.a; // 調用的是虛謹父類的屬性

3. java 中實現多態的機制是什麼

沒有繼鄭友承就沒有多態 當然有介面也會有老叢沒多態因為介面可以說是一種特殊的繼承
給你舉個例子 NEW對象的時候 用父類的類型來NEW子類 當調用方法或欄位的時候會先在子類裡面找如果子類沒有 然後又會到父類裡面找 當然如果父類也沒有 那麼 編譯的時候就等著報侍納錯吧! 這可以說是一種多態的形式
應該能懂吧 我當初也不懂 別人就是這么給我說了下也就懂了!~ 呵呵

4. 在java中什麼是多態。。 什麼時候用多態

Java是面向對象的語言,多態性是面向對象程序設計代碼重用的一個最強大機制,動態性的概念也可以被說成「一個介面,多個方法」。Java實現運行時多態性的基礎是動態方法調度,它是一種在運行時而不是在編譯期調用重載方法的機制,
1.可替換性。多態對已存在的代碼具有可替換性。
2.可擴充性。多態對代碼具有可擴充性。增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。實際 上新加子類更容易獲得多態功能。
3.介面性。多態是超類通過方法簽名,向子類提供了一個共同介面,由子類來完善或者覆蓋它而實現的。
4.靈活性。它在應用中體現了靈活多樣的操作,提高了使用效率。
5.簡化性。多態簡化了對應用軟體的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤為突出和重要。值得注意的是,多態並不能夠解決提高執行速度的問題,因為它基於動態裝載和地址引用,或稱動態綁定。
在程序需要擴展的時候,需要使用到多態。

5. 什麼是多態機制

多態首先是建立在繼承的基礎上的,先有繼承才能有多態。多態是指不同的子類在繼承父類後分別都重寫覆蓋了父類的方法,即父類同一個方法,在繼承的子類中表現出不同的形式。多態成立的另一個條件是在創建子類時候必須使用父類new子類的方式。

多態(Polymorphism)按字面的意思就是「多種狀態」。在面向對象語言中,介面的多種不同的實現方式即為多態。引用Charlie Calverts對多態的描述——多態性是允許你將父對象設置成為一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作(摘自「Delphi4編程技術內幕」)。

簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態性在Object Pascal和C++中都是通過虛函數實現的。

拓展資料:

多態指同一個實體同時具有多種形式。它是面向對象程序設計(OOP)的一個重要特徵。如果一個語言只支持類而不支持多態,只能說明它是基於對枝侍象的,而不是鍵散面向對象的。C++中的多態性具體體現在運行和編譯兩個方面。運行時多態是動態多態,其具體引用的對象在運行時才能確定。編譯時多態是靜態多態,在編譯時就可以確定對象使用的形式。

多態:同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。

C++中,實現多態有以下方法:虛函數,抽象類,覆蓋,模板(重載和多態無關)。

OC中的多態:不同對象對同一消息的不同響應.子類可以重寫父類的方法。

多態就是允許方法重名 參數或返回值可以是父類型傳入或返回。

多態也指生物學中腔腸動物的特殊的生活方式。水螅態與水母態的世代交替現象。

把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。

賦值之後,父類型的引用就可以根據當前賦值給它的子對象的特性以不同的方式運作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。

使用繼承性的結果就是當創建了一個類的家族,在認識這個類的家族時,就是把子類的對象當作基類的對象,這種認識又叫作upcasting(向上轉型)。這樣認識的重要性在於:我稿搭氏們可以只針對基類寫出一段程序,但它可以適應於這個類的家族,因為編譯器會自動找出合適的對象來執行操作。這種現象又稱為多態性。而實現多態性的手段又叫稱動態綁定(dynamic binding)。

簡單的說,建立一個父類對象的引用,它所指對象可以是這個父類的對象,也可以是它的子類的對象。java中當子類擁有和父類同樣的函數,當通過這個父類對象的引用調用這個函數的時候,調用到的是子類中的函數。

6. java中多態具體是什麼

首先表明觀點,重載不是java多態的一種體現。

java的多態是指在程序運行過程中由虛擬機確定到底該使用哪種形態完成指定行為的一個過程。如下:

Parent p = new Son();

p.speak();

如果在Son中對父類speak()方法進行了重寫,那麼當你代碼寫到這里時,編譯器是不知道要執行Parent中的speak()還是Son中的speak()方法的,編譯器只知道這樣寫不會發生語法錯誤;只有在運行過程中才會根據實際在內存中(堆)創建的對象去執行相應的方法

如果重載是多態,那我問你,當你在代碼中寫上某個重載的方法後,此時編譯器不是已經確定了到底是哪個方法在完成你的功能嗎?這僅僅是編譯期,程序還沒有運行呢。

我還看到一些關於多態的其他說法,比如:編譯時多態,運行時多態。而這種觀點普遍認為重載就是多態體現的一種,因為重載算是編譯時多態,而運行時多態中就是我上面寫的那個例子。

借用一句《Java編程思想》作者Bruce Eckel的話:"不要犯傻,如果它不是晚綁定,它就不是多態"。這里的晚綁定就是指動態綁定,早綁定就是指靜態綁定,也就是所謂的重載。

具體如何理解,網上關於這方面的討論一大堆,各位自行參考。

7. java中多態是怎麼一回事

多態字面上理解就是多種狀態的意思,在java中就是同一個基亂彎方法調用能獲取不同的結果,體現在重寫和重載上。其實是因為確定一個函數需要幾個關鍵點:方法名,參數個數,參數類型,順序,(返回類型在java中不能確定),(注意和參數名沒有關系),那麼同一個方法名就可以根據參數類型,參數個數,順序不同寫很多個方法,這時候我們調用同一個方法名,傳入不同的參數就能返回不同的結果,也就是多態裡面的重載了。另外重寫是陪褲因為java當中有繼承的概念,父類的部分方法(看許可權修飾符)子類也能用搏悶,那麼當子類中同樣實現了這個方法,就是函數幾個關鍵點要相同,包含返回類型,完全相同,那麼當使用子類對象調用時,優先使用的是自己的方法,如果用父類的對象調用,那就是父類的方法,看具體的實現類,使用的場景很多,比如,java同一個介面有多個實現,當調用介面的方法時看具體的實現類。

8. java中實現多態的機制

我的理解就是讓父類的引用指向子類的對象,你在使用父類的引用調用方法的時候,不是使用父類中的方法,而是父類指向的對象的方法。這樣就實現了多態···

9. java中多態是什麼意思

什麼是多態

1.面向對象輪蔽的三大特性:封裝、繼承、多態。從一定角度來看,封裝和繼承幾乎都是為多態而准備的。這是我們最後一個概念,也是最重要的知識點。

2.多態的定義:指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而採用多種不同的行為方式。(發送消息就是函數調用)

3.實現多態的技術稱為:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。

4.多態的作用:消除類型之間的耦合關系。

5.現實中,關於多態的例子不勝枚舉。

下面是多態存在的三個必要條件,要求大家做夢時都能背出來!

多態存在的三個必要條件

一、要有繼承;

二、要有重寫;

三、父類引用指向子類對象。

多態的好處:

1.可替換性(substitutability)。多態對已存在代碼具有可替拍緩換性。例如,多態對圓Circle類工作,對其他任何圓形幾何體,如圓環,也同樣工作。

2.可擴充性(extensibility)。多態對代碼具有可擴充性。增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。實際上新加子類更容易獲得多態功能。例如,在實現了圓錐、半圓錐以及半球體的多態基礎上,襲桐模很容易增添球體類的多態性。

3.介面性(interface-ability)。多態是超類通過方法簽名,向子類提供了一個共同介面,由子類來完善或者覆蓋它而實現的。如圖8.3 所示。圖中超類Shape規定了兩個實現多態的介面方法,computeArea()以及computeVolume()。子類,如Circle和Sphere為了實現多態,完善或者覆蓋這兩個介面方法。

4.靈活性(flexibility)。它在應用中體現了靈活多樣的操作,提高了使用效率。

5.簡化性(simplicity)。多態簡化對應用軟體的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤為突出和重要。

10. 怎麼理解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的多態機制是什麼相關的資料

熱點內容
為什麼我的世界天空伺服器進不去 瀏覽:260
釘釘直播後的視頻如何線上加密 瀏覽:503
聽主的命令 瀏覽:206
全民上雲時代雲伺服器 瀏覽:519
iphone不創建id如何下載app 瀏覽:970
windowsphp擴展安裝 瀏覽:93
emacslinux配置文件 瀏覽:379
python3在線教程 瀏覽:114
不小心刪文件夾的文件 瀏覽:480
java獲取手機IP 瀏覽:816
手機rar解壓密碼獲取 瀏覽:344
程序員被辭退工資怎麼處理 瀏覽:494
戀活的模型沒加密 瀏覽:159
如何把安卓機的微信轉移蘋果 瀏覽:583
爬山演算法相關題目 瀏覽:724
vc編程大全 瀏覽:118
excel表格單列數據加密 瀏覽:649
給同事的解壓話語 瀏覽:993
linux關閉網卡命令行 瀏覽:455
史上最漂亮程序員 瀏覽:771