程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 懂得Java中的靜態綁定和靜態綁定

懂得Java中的靜態綁定和靜態綁定

編輯:關於JAVA

懂得Java中的靜態綁定和靜態綁定。本站提示廣大學習愛好者:(懂得Java中的靜態綁定和靜態綁定)文章只能為提供參考,不一定能成為您想要的結果。以下是懂得Java中的靜態綁定和靜態綁定正文


一個Java法式的履行要經由編譯和履行(說明)這兩個步調,同時Java又是面向對象的編程說話。當子類和父類存在統一個辦法,子類重寫了父類的辦法,法式在運轉時挪用辦法是挪用父類的辦法照樣子類的重寫辦法呢,這應當是我們在初學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. 下一頁:
Copyright © 程式師世界 All Rights Reserved