搜尋
首頁Javajava教程Java中的靜態綁定和動態綁定概念和區別實力程式碼分析

在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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JVM如何處理操作系統API的差異?JVM如何處理操作系統API的差異?Apr 27, 2025 am 12:18 AM

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

Java 9影響平台獨立性中引入的模塊化如何?Java 9影響平台獨立性中引入的模塊化如何?Apr 27, 2025 am 12:15 AM

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

什麼是字節碼,它與Java的平台獨立性有何關係?什麼是字節碼,它與Java的平台獨立性有何關係?Apr 27, 2025 am 12:06 AM

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

為什麼Java被認為是一種獨立於平台的語言?為什麼Java被認為是一種獨立於平台的語言?Apr 27, 2025 am 12:03 AM

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

圖形用戶界面(GUIS)如何提出Java平台獨立性的挑戰?圖形用戶界面(GUIS)如何提出Java平台獨立性的挑戰?Apr 27, 2025 am 12:02 AM

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

Java開發的哪些方面取決於平台?Java開發的哪些方面取決於平台?Apr 26, 2025 am 12:19 AM

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

在不同平台上運行Java代碼時是否存在性能差異?為什麼?在不同平台上運行Java代碼時是否存在性能差異?為什麼?Apr 26, 2025 am 12:15 AM

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

Java平台獨立性有什麼局限性?Java平台獨立性有什麼局限性?Apr 26, 2025 am 12:10 AM

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

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

Safe Exam Browser

Safe Exam Browser

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

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能