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
*
* */
java 多態 動態綁定
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.