動態繫結一
動態繫結是java物件導向中非常重要的思想,很多java程式設計師不太清楚多型機制, 無疑會導致對多型理解程度不夠,下面透過程式碼以及在記憶體中的執行過程來分析動態繫結,如有錯誤不當之處,請讀者指正!
上面的簡單程式碼相信很多朋友似曾相識,或者說很明白的看清程式碼意思。
首先我們還是從程式的開始類主函式分析:(關於比較細節的描述,請看之前寫過的一篇文章:http://blog.itpub.net/29876893/viewspace-1816246/,這裡不作過細分析)
a1.首先在棧中放入一Cat型別的區域性變數c,然後在堆中new出一Cat型別的物件記憶體,其中記憶體大致分為兩部分,A部分是父類Animal物件,其中有成員變數,該例name被賦值為catname,B部分是自己的成員變數eyesColor,被賦值為blue,然後棧中的Cat引用c指向堆中new出的Cat例項的全部
a2.在棧中放入Lady的引用ll,然後在堆中new出一Lady型別的物件記憶體,其中成員變數name被賦值為ll,成員變數pet被c賦值,也就是此時pet和c同時指向堆中的同一Cat例項,但是pet是Animal的引用,而Cat繼承自Animal,所以此時pet指向的是普通的Animal堆記憶體,也就是A
a3.此時用ll呼叫myPetEnjoy(),然後pet此時又呼叫enjoy(),此時你也會想,pet到底呼叫哪個enjoy?由於方法是放在程式碼區,此時程式碼區有Animal的enjoy方法程式碼段,和Cat的enjoy方法程式碼段。在A中有Animalenjoy方法的指標C指向程式碼區中的Animal的enjoy方法程式碼段,由於動態繫結機制(程式執行期間),new出誰的物件,那麼C就指向被該物件重寫的方法,此時C指向了Cat的enjoy方法程式碼段,這就是動態繫結。
同理b1,b2,b3分析如上。
那麼動態繫結(多型)給我們帶來什麼好處呢?使得程式的可擴充套件性達到了極致,如果上面Lady養了更多的寵物,那麼只需要加上所養寵物的類(新增屬性和方法),而Lady類不需要做任何的改變。
更多的動態繫結機制可以參考《thinking in java》
由於不能畫出整個過程,敘述難免空洞,感興趣的讀者可以畫圖,會變的一目瞭然。
點選(此處)摺疊或開啟
-
public class Animal {
-
-
private String name;
-
-
Animal(String name){
-
-
this.name = name;
-
}
-
-
public void enjoy(){
-
-
System.out.println("叫聲...");
-
}
-
}
-
-
public class Cat extends Animal {
-
-
private String eyesColor;
-
-
Cat(String n,String c){
-
-
super(n);
-
eyesColor = c;
-
}
-
-
public void enjoy(){
-
-
System.out.println("貓叫聲...");
-
}
-
}
-
-
-
public class Dog extends Animal{
-
-
private String furColor;
-
-
Dog(String n,String c){
-
-
super(n);
-
furColor = c;
-
}
-
-
public void enjoy(){
-
-
System.out.println("狗叫聲。。。");
-
}
-
}
-
-
public class Lady {
-
-
private String name;
-
private Animal pet;
-
-
Lady(String name,Animal pet){
-
-
this.name = name;
-
this.pet = pet;
-
}
-
public void myPetEnjoy(){
-
-
pet.enjoy();
-
}
-
}
-
-
public class Test {
-
-
public static void main(String[] args){
-
-
Cat c = new Cat("catname", "bule"); //a1
-
Dog d = new Dog("dogname", "black"); //b1
-
Lady ll = new Lady("ll", c); //a2
-
Lady l2 = new Lady("12", d); //b2
-
ll.myPetEnjoy(); //a3
-
l2.myPetEnjoy(); //b3
-
}
- }
首先我們還是從程式的開始類主函式分析:(關於比較細節的描述,請看之前寫過的一篇文章:http://blog.itpub.net/29876893/viewspace-1816246/,這裡不作過細分析)
a1.首先在棧中放入一Cat型別的區域性變數c,然後在堆中new出一Cat型別的物件記憶體,其中記憶體大致分為兩部分,A部分是父類Animal物件,其中有成員變數,該例name被賦值為catname,B部分是自己的成員變數eyesColor,被賦值為blue,然後棧中的Cat引用c指向堆中new出的Cat例項的全部
a2.在棧中放入Lady的引用ll,然後在堆中new出一Lady型別的物件記憶體,其中成員變數name被賦值為ll,成員變數pet被c賦值,也就是此時pet和c同時指向堆中的同一Cat例項,但是pet是Animal的引用,而Cat繼承自Animal,所以此時pet指向的是普通的Animal堆記憶體,也就是A
a3.此時用ll呼叫myPetEnjoy(),然後pet此時又呼叫enjoy(),此時你也會想,pet到底呼叫哪個enjoy?由於方法是放在程式碼區,此時程式碼區有Animal的enjoy方法程式碼段,和Cat的enjoy方法程式碼段。在A中有Animalenjoy方法的指標C指向程式碼區中的Animal的enjoy方法程式碼段,由於動態繫結機制(程式執行期間),new出誰的物件,那麼C就指向被該物件重寫的方法,此時C指向了Cat的enjoy方法程式碼段,這就是動態繫結。
同理b1,b2,b3分析如上。
那麼動態繫結(多型)給我們帶來什麼好處呢?使得程式的可擴充套件性達到了極致,如果上面Lady養了更多的寵物,那麼只需要加上所養寵物的類(新增屬性和方法),而Lady類不需要做任何的改變。
更多的動態繫結機制可以參考《thinking in java》
由於不能畫出整個過程,敘述難免空洞,感興趣的讀者可以畫圖,會變的一目瞭然。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1816523/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 理解靜態繫結與動態繫結
- C++的動態繫結和靜態繫結C++
- java中的靜態繫結與動態繫結Java
- JAVA動態繫結淺析Java
- 三、動態繫結屬性
- vue 動態繫結 v-modelVue
- 動態繫結 input v-model
- 關於動態字串的繫結字串
- Vue select 繫結動態變數Vue變數
- Vue 動態繫結CSS樣式VueCSS
- 介面的繫結方案和動態SQLSQL
- class 和 style 資料動態繫結
- 域名繫結動態IP實戰案例
- 動態生成的html元素繫結click事件HTML事件
- jQuery實現DOM元素事件動態繫結jQuery事件
- Vue一個案例引發的動態元件與全域性事件繫結總結Vue元件事件
- Vue 框架-05-動態繫結 css 樣式Vue框架CSS
- 構造器中呼叫動態繫結的方法
- 後期靜態繫結
- oracle 11g 新特性之動態繫結變數窺視(一)Oracle變數
- 05-v-bind動態繫結class(物件語法)物件
- 延遲靜態繫結——static
- php 後期靜態繫結PHP
- 動態生成html元素繫結事件iphone失效問題解決HTML事件iPhone
- 百度前端學院任務動態資料繫結(五)前端
- Binding(一):資料繫結
- 【轉載】WPF中TreeView控制元件資料繫結和後臺動態新增資料(一)View控制元件
- JS中動態新增元素並繫結事件,造成程式重複執行JS事件
- oracle 11g 新特性之動態繫結變數窺視(二)Oracle變數
- vue基礎-動態樣式&表單繫結&vue響應式原理Vue
- 2. Vue語法--插值操作&動態繫結屬性 詳解Vue
- 對 PHP 後期靜態繫結的理解PHP
- VUE動態(自動)Loading【繫結到URL】,同頁面多個Loading互不衝突Vue
- 一維動態規劃總結動態規劃
- 使用 Hooks 簡化受控元件的狀態繫結Hook元件
- 後期靜態繫結在PHP中的使用PHP
- Vue雙向繫結原理,教你一步一步實現雙向繫結Vue
- 在 Vue 中如何避免在動態繫結 類 出現空 類 的情況?Vue
- ue4繫結動畫、重定向動畫動畫