在Java中存在兩種綁定方式,一種為靜態綁定,又稱為早期綁定。另一種是動態綁定,也稱為後期綁定。
程式綁定的概念:
綁定指的是一個方法的呼叫與方法所在的類別(方法主體)關聯起來。對java來說,綁定分為靜態綁定和動態綁定;或稱為前期綁定和後期綁定
#靜態綁定(早期綁定編譯器綁定):
在程式執行前方法已經被綁定,此時由編譯器或其它連接程式實作。例如:C 。針對java可以理解為程式編譯期的綁定;特別說明一點,java當中的方法只有final,static,private和構造方法是前期綁定
##動態綁定(遲綁定運行期綁定):
後期綁定:在運行時根據特定物件的類型進行綁定。 若一種語言實作了後期綁定,同時必須提供一些機制在運行期間判斷物件的類型,並分別呼叫適當的方法。也就是說編譯器此時依然不知道物件的類型,但方法呼叫機制能自己去調查,找到正確的方法主體。不同的語言對後期綁定的實作方法是有所區別的。可以這樣認為:它們都要在物件中安插某些特殊類型的信息。 動態綁定的過程:虛擬機器提取物件的實際類型的方法表
#虛擬機器搜尋方法簽章
#呼叫方法
#關於綁定相關的總結:
# 了解三者的概念之後,我們發現java屬於後期綁定。在java中,幾乎所有的方法都是後期綁定,在運行時動態綁定方法屬於子類別還是基類。但也有特殊,針對static方法和final方法由於不能繼承,因此在編譯時就可以確定他們的值,他們是屬於前期綁定。特別說明的一點,private宣告的方法和成員變數不能被子類別繼承,所有的private方法都被隱式的指定為final的(由此我們知道:將方法宣告為final類型的 一是為了防止方法被覆寫,二是為了有效的關閉java中的動態綁定)。 java中的後期綁定是由JVM來實現的,我們不用去顯式的聲明它,而C++則不同,必須明確的聲明某個方法具備後期綁定。 java當中的向上轉型或說多態是藉助於動態綁定實現的,所以理解動態綁定,也就搞定向上轉型和多態。對於java當中的方法而言,除了final,static,private和建構方法是前期綁定外,其他的方法全部為動態綁定。而動態綁定的典型發生在父類別和子類別的轉換宣告之下:例如:
Parent p = new Children();具體流程如下:1、編譯器檢查物件的宣告型別及方法名稱。假設我們呼叫x.f(args)方法,且x已經被宣告為C類別的對象,那麼編譯器會列舉出C類別中所有的名稱為f的方法和從C類別的超類別繼承過來的f方法2、接下來編譯器檢查方法呼叫中提供的參數型別。如果在所有名稱為f 的方法中有一個參數類型和呼叫提供的參數類型最為匹配,那麼就調用這個方法,這個過程叫做“重載解析”
3、當程式運行並且使用動態綁定呼叫方法時,虛擬機器必須呼叫同x所指向的物件的實際類型相符的方法版本。假設實際型別為D(C的子類別),如果D類別定義了f(String)那麼該方法被調用,否則就在D的超類別中搜尋方法f(String),依次類別推
問題思考:
如何提供給方法使用者一個方法,來完成一個任務。如果用戶有特殊要求又要可以自訂自己的方法?
涉及知識:
子父類,接口,向上轉型,動態綁定
具體程式碼:
package com.chengxuyuanzhilu; public interface MyInterfaces { void doting(); } package com.chengxuyuanzhilu; public class Drink implements MyInterfaces { @Override public void doting() { System.out.println("我在喝水"); } } package com.chengxuyuanzhilu; public class Eat implements MyInterfaces { @Override public void doting() { System.out.println("我在吃东西"); } } package com.chengxuyuanzhilu; public class Run implements MyInterfaces { @Override public void doting() { System.out.println("我在奔跑"); } } package com.chengxuyuanzhilu; public class TestDynamicBind { public static void main(String[] args) { MyInterfaces my = null; my = new Eat(); bind(my); my = new Drink(); bind(my); my = new Run(); bind(my); } static void bind(MyInterfaces my){ my.doting(); } }
區別對比
1.靜態綁定發生在編譯時期,動態綁定發生在運行時2.使用private或static或final修飾的變數或方法,使用靜態綁定。而虛方法(可以被子類別重寫的方法)則會根據運行時的物件進行動態綁定。
3.靜態綁定使用類別資訊來完成,而動態綁定則需要使用物件資訊來完成。
4.重載(Overload)的方法使用靜態綁定完成,而重寫(Override)的方法則使用動態綁定完成。 驗證######使用javap不能直接驗證動態綁定,然後如果證明沒有進行靜態綁定,那麼就說明進行了動態綁定。 ###22:27 $ javap -c TestMain Compiled from "TestMain.java" public class TestMain { public TestMain(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: new #2 // class java/lang/String 3: dup 4: invokespecial #3 // Method java/lang/String."<init>":()V 7: astore_1 8: new #4 // class TestMain$SubCaller 11: dup 12: invokespecial #5 // Method TestMain$SubCaller."<init>":()V 15: astore_2 16: aload_2 17: aload_1 18: invokevirtual #6 // Method TestMain$Caller.call:(Ljava/lang/String;)V 21: return }
以上是Java中的靜態綁定和動態綁定概念和區別實力程式碼分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JVM通過JavaNativeInterface(JNI)和Java標準庫處理操作系統API差異:1.JNI允許Java代碼調用本地代碼,直接與操作系統API交互。 2.Java標準庫提供統一API,內部映射到不同操作系統API,確保代碼跨平台運行。

modularitydoesnotdirectlyaffectJava'splatformindependence.Java'splatformindependenceismaintainedbytheJVM,butmodularityinfluencesapplicationstructureandmanagement,indirectlyimpactingplatformindependence.1)Deploymentanddistributionbecomemoreefficientwi

BytecodeinJavaistheintermediaterepresentationthatenablesplatformindependence.1)Javacodeiscompiledintobytecodestoredin.classfiles.2)TheJVMinterpretsorcompilesthisbytecodeintomachinecodeatruntime,allowingthesamebytecodetorunonanydevicewithaJVM,thusfulf

javaachievesplatformIndependencEthroughThoJavavIrtualMachine(JVM),wodecutesbytecodeonyanydenanydevicewithajvm.1)javacodeiscompiledintobytecode.2)

JavaGUI開發中的平台獨立性面臨挑戰,但可以通過使用Swing、JavaFX,統一外觀,性能優化,第三方庫和跨平台測試來應對。 JavaGUI開發依賴於AWT和Swing,Swing旨在提供跨平台一致性,但實際效果因操作系統不同而異。解決方案包括:1)使用Swing和JavaFX作為GUI工具包;2)通過UIManager.setLookAndFeel()統一外觀;3)優化性能以適應不同平台;4)使用如ApachePivot或SWT的第三方庫;5)進行跨平台測試以確保一致性。

JavadevelovermentIrelyPlatForm-DeTueTososeVeralFactors.1)JVMVariationsAffectPerformanceNandBehaviorAcroSsdifferentos.2)Nativelibrariesviajnijniiniininiinniinindrododerplatefform.3)

Java代碼在不同平台上運行時會有性能差異。 1)JVM的實現和優化策略不同,如OracleJDK和OpenJDK。 2)操作系統的特性,如內存管理和線程調度,也會影響性能。 3)可以通過選擇合適的JVM、調整JVM參數和代碼優化來提升性能。

Java'splatFormentenceHaslimitations不包括PerformanceOverhead,versionCompatibilityIsissues,挑戰WithnativelibraryIntegration,Platform-SpecificFeatures,andjvminstallation/jvminstallation/jvmintenance/jeartenance.therefactorscomplicatorscomplicatethe“ writeOnce”


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

記事本++7.3.1
好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3漢化版
中文版,非常好用

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能