動態繫結一
動態繫結是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++
- C++的動態繫結和靜態繫結C++
- java繼承-靜態繫結和動態繫結Java繼承
- java中的靜態繫結與動態繫結Java
- 動態繫結和靜態繫結的簡單理解
- 深入理解 C++ 的動態繫結和靜態繫結C++
- JAVA動態繫結淺析Java
- 三、動態繫結屬性
- 動態繫結的心得 (轉)
- vue 動態繫結 v-modelVue
- 動態繫結 input v-model
- Vue 動態繫結CSS樣式VueCSS
- 關於動態字串的繫結字串
- class 和 style 資料動態繫結
- Vue select 繫結動態變數Vue變數
- 域名繫結動態IP實戰案例
- vue動態(type可變)input繫結Vue
- 介面的繫結方案和動態SQLSQL
- Vue 動態資料繫結核心方法Vue
- SQL Server動態SQL,繫結變數SQLServer變數
- java基礎:多型(動態繫結)Java多型
- jQuery實現DOM元素事件動態繫結jQuery事件
- Java 動態繫結機制的內幕Java
- 動態生成的html元素繫結click事件HTML事件
- jquery 為動態新增的元素繫結事件jQuery事件
- 繫結變數在靜態sql和動態sql中變數SQL
- java之多型(Polymorphic)、動態繫結(Dynamic Binding)、遲繫結(Late Binding)Java多型
- Vue一個案例引發的動態元件與全域性事件繫結總結Vue元件事件
- Vue 框架-05-動態繫結 css 樣式Vue框架CSS
- 構造器中呼叫動態繫結的方法
- jquery給動態新增的dom元素繫結事件jQuery事件
- 動態建立的DOM元素進行事件繫結事件
- oracle 11g 新特性之動態繫結變數窺視(一)Oracle變數
- 05-v-bind動態繫結class(物件語法)物件
- jQuery給動態新增的元素繫結事件的方法jQuery事件
- docker高階應用之動態繫結卷組薦Docker
- 動態條件的繫結變數的解決變數