欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java動(dòng)態(tài)綁定和靜態(tài)綁定用法實(shí)例詳解

 更新時(shí)間:2019年05月20日 09:14:23   作者:XINGKONG_04  
這篇文章主要介紹了java動(dòng)態(tài)綁定和靜態(tài)綁定用法,結(jié)合實(shí)例形式詳細(xì)分析了java動(dòng)態(tài)綁定與靜態(tài)綁定相關(guān)概念、原理、實(shí)現(xiàn)方法及使用注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了java動(dòng)態(tài)綁定和靜態(tài)綁定用法。分享給大家供大家參考,具體如下:

背景

1.當(dāng)子類和父類存在同一個(gè)方法,子類重寫了父類的方法,程序在運(yùn)行時(shí)調(diào)用的是父類的方法還是子類的重寫方法呢(尤其是存在向上類型轉(zhuǎn)換的情況)?

2.當(dāng)一個(gè)類中存在方法名相同但參數(shù)不同(重載)的方法,程序在執(zhí)行的時(shí)候該如何辨別區(qū)分使用哪個(gè)方法呢?

在java中存在綁定的機(jī)制解決以上疑問(wèn)。

綁定

綁定:將一個(gè)方法的調(diào)用與方法所在的類(方法主體)關(guān)聯(lián)起來(lái)。即決定調(diào)用哪個(gè)方法和變量。

在java中,綁定分為靜態(tài)綁定和動(dòng)態(tài)綁定。也叫作前期綁定和后期綁定。

靜態(tài)綁定

在程序執(zhí)行以前已經(jīng)被綁定(即在編譯過(guò)程中就已經(jīng)知道這個(gè)方法到底是哪個(gè)類中的方法)。

java當(dāng)中的方法只有final、static、private修飾的的方法和構(gòu)造方法是靜態(tài)綁定的。

private修飾的方法:private修飾的方法是不能被繼承的,因此子類無(wú)法訪問(wèn)父類中private修飾的方法。所以只能通過(guò)父類對(duì)象來(lái)調(diào)用該方法體。因此可以說(shuō)private方法和定義這個(gè)方法的類綁定在了一起。

final修飾的方法:可以被子類繼承,但是不能被子類重寫(覆蓋),所以在子類中調(diào)用的實(shí)際是父類中定義的final方法。(使用final修飾方法的兩個(gè)好處:(1)防止方法被覆蓋;(2)關(guān)閉java中的動(dòng)態(tài)綁定)。

static修飾的方法:可以被子類繼承,但是不能被子類重寫(覆蓋),但是可以被子類隱藏。(這里意思是數(shù)哦如果父類里有一個(gè)static方法,它的子類里如果沒有對(duì)應(yīng)的方法,那么當(dāng)子類對(duì)象調(diào)用這個(gè)方法時(shí)就會(huì)使用父類中的方法,而如果子類中定義了相同的方法,則會(huì)調(diào)用子類中定義的方法,唯一的不同就是:當(dāng)子類對(duì)象向上類型轉(zhuǎn)換為父類對(duì)象時(shí),不論子類中有沒有定義這個(gè)靜態(tài)方法,該對(duì)象都會(huì)使用父類中的靜態(tài)方法,因此這里說(shuō)靜態(tài)方法可以被隱藏而不能被覆蓋。這與子類隱藏父類中的成員變量是一樣的。隱藏和覆蓋的區(qū)別在于,子類對(duì)象轉(zhuǎn)換成父類對(duì)象后,能夠訪問(wèn)父類被隱藏的變量和方法,而不能訪問(wèn)父類被覆蓋的方法)。

構(gòu)造方法:構(gòu)造方法也是不能被繼承的(因?yàn)樽宇愂峭ㄟ^(guò)super方法調(diào)用父類的構(gòu)造函數(shù),或者是jvm自動(dòng)調(diào)用父類的默認(rèn)構(gòu)造方法),因此編譯時(shí)也可以知道這個(gè)構(gòu)造方法方法到底是屬于哪個(gè)類的。

因此,一個(gè)方法被繼承,或者是被繼承后不能被覆蓋,那么這個(gè)方法就采用靜態(tài)綁定

動(dòng)態(tài)綁定

在運(yùn)行時(shí)期根據(jù)具體對(duì)象的類型進(jìn)行綁定。

若一種語(yǔ)言實(shí)現(xiàn)了后期綁定,同時(shí)必須提供一些機(jī)制,可在運(yùn)行期間判斷對(duì)象的類型,并分別調(diào)用適當(dāng)?shù)姆椒āR簿褪钦f(shuō),編譯器此時(shí)依然不知道對(duì)象的類型,但方法調(diào)用機(jī)制能自己去調(diào)查,找到正確的方法主體。不同的語(yǔ)言對(duì)后期綁定的實(shí)現(xiàn)方法是有所區(qū)別的,但我們至少可以這樣認(rèn)為:它們都要在對(duì)象中安插某些特殊類型的信息。

動(dòng)態(tài)綁定的過(guò)程:

1.虛擬機(jī)提取對(duì)象實(shí)際類型的方法表

2.虛擬機(jī)搜索方法簽名

3.調(diào)用方法

java中重載的方法使用靜態(tài)綁定,重寫的方法使用動(dòng)態(tài)綁定。

實(shí)驗(yàn)

package practice;
public class Bind{
 public static void main(String[] args) {
 Child c = new Child();
 Parent p = c;
 
 System.out.println(p.getPristr());
 System.out.println(c.pristr);
 c.print();
 p.print();
 
 c.print1();
 p.print1();
 
 c.print2();
 p.print2();
 
 }
}
class Parent{
 private String pristr = "parent private string";
 String pubstr = "public string";
 
 public String getPristr() {
 return pristr;
 }
 public void setPristr(String pristr) {
 this.pristr = pristr;
 }
 public Parent() {
 System.out.println("parent構(gòu)造函數(shù)");
 }
 
  final public void print() {
   System.out.println("parent的print");
  }
  public static void print1() {
   System.out.println("parent的print1");
  }
  public void print2() {
   System.out.println("parent的print2");
  }
}
class Child extends Parent{
 String pristr = "child private string";
 String pubstr = "public string";
 
 public Child() {
 System.out.println("child構(gòu)造函數(shù)");
 }
 
 public static void print1() {
 System.out.println("child的print1");
  }
 
 public void print2() {
   System.out.println("child的print2");
  }
}

結(jié)果

parent構(gòu)造函數(shù)
child構(gòu)造函數(shù)
parent private string
child private string
parent的print
parent的print
child的print1
parent的print1
child的print2
child的print2

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評(píng)論