java 多態 動態綁定

package com.bjpowernode.mybatis.test;

public class TestMethod {

	public static void main(String[] args) {

		/* 動態綁定
		 * 在調用成員方法時,會將方法和對象的實際內存進行綁定,調用實際內存中的方法。
		 * 
		 * 函數參數不用到動態綁定
		 * 所以test(a1)就調用第一個
		 * 
		 * 
		A a = new A();
		test(a);	//
		
		B b = new B();
		test(b);
		
		A a1 = new B();
		test(a1);
		
		*/
		A a = new A();
		System.out.println(a.getResult());
		
		B b = new B();
		System.out.println(b.getResult());
		
		A a1 = new B();
		System.out.println(a1.getResult());
		
	}
	
	public static void test( A a) {
		System.out.println("Type of the param is A");
	}
	
	public static void test( B b) {
		System.out.println("Type of the param is B");
	}

}
/*
class A {
	
	private int i = 10;
	
	public int getResult() {
		return i + 10;
	}
}
class B extends A {
	
	private int i = 20;
	
	public int getResult() {
		return i + 20;
	}
}
執行結果
 *  20
 *	40
 *	40
 * 最基本的動態調用
 * 多態: 一個對象,在環境不同的條件下,會表現出不同的行爲
 * 動態綁定: 在調用成員方法時,會將方法和對象的實際內存進行綁定,調用實際內存中的方法。
 * 	     注意: 只侷限於成員方法
 * */


/*
class A {
	
	private int i = 10;
	
	public int getResult() {
		return i + 10;
	}
}
class B extends A {
	
	private int i = 20;
	
}
這種情況呢?子類沒有繼承父類的成員方法,而繼承了父類的成員變量呢?
 *執行結果:
 *	20
 *	20
 *	20
 * A a = new B();
 * 1. 子類沒有重寫父類的方法,但是會繼承下來,所以B中有一個叫getResuult()的方法,只是看不到,
 * 2. 這個方法實際內存地址是A類對象的,在運行期調用方法時,JVM發現B對象中這個方法的地址與類B不匹配,
 * 		而是與類A對象的地址象吻合,那麼他就會調用類A中的getResult方法,上面說過了,成員變量i不參加動態綁定
 * 		所以即使B對象中有i也不會用他的,而是用A對象的.
 * 3.出現這種情況的前提是B對象沒有重寫A對象的方法.
 * */

/*
class A {
	
	private int i = 10;
	
	public int getResult() {
		return getI() + 10;
	}
	
	public int getI() {
		return i;
	}
}
class B extends A {
	
	private int i = 20;
}

這種情況呢? 雖然子類沒有重寫父類的成員方法,而是重寫了get方法?
 * 執行結果:
 *  20
 *	30
 *  30
 * 爲什麼出現這種情況?
 * 還是那句話: 只有成員方法參加多態的運行. 不管你是在哪調用的,即使你在成員方法中調用
 * 			一個方法,只要是子類重寫了,那麼就多態.
 * 根據上一個例子: 它調用父類的getResult時,內部有一個getI(),這時候要多態了,發現子類
 * 				重寫了,那麼就調用子類的,返回20
 */
/*
class A {
	
	private int i = 10;
	
	public int getResult() {
		return getI() + 10;
	}
	
	public int getI() {
		return i;
	}
}
class B extends A {
	
	private int i = 20;
	
}
這種情況就更明瞭了.
 * 執行結果:
 *  20
 *	20
 *	20
 * 
 * */

class A {
	
	private int i = 10;
	
	public int getResult() {
		return getI() + 10;
	}
	
	public int getI() {
		return i;
	}
}
class B extends A {
	
	private int i = 20;
	
	public int getResult() {
		return getI() + 20;
	}
}
/*
* 執行結果:
*  20
*  30
*  30
* 
* */

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章