原力計劃


原力計劃

文章插圖
原力計劃本文將會帶你了解行為方法分派,從而幫助你在行為分派時進行一些功能操作 。具體將會講解行為分派的類型:靜態 & 動態行為分派,希望對大家有幫助 。
作者 | Carson_Ho
本文系CSDN博文
知識儲備
分派
定義:確定執行哪個方法的過程 。
有些讀者會問,方法的執行不是取決于代碼設置中的執行對象嗎?為什么還要選擇呢?答案是,若一個對象對應于多個方法時,就需要進行選擇 。
讀者應該都想到了Java中的特性:多態,即重寫 & 重載 。
此外還有分類,分類包括靜態分派 & 動態分派 。下面我將詳細講解 。
變量的靜態類型 & 動態類型
先看下面的代碼
public class Test {
static abstract class Human {
}
static class Man extends Human {
}
static class Woman extends Human {
【原力計劃】}
// 執行代碼
public static void main(String[] args) {
Human man = new Man;
// 變量man的靜態類型 = 引用類型 = Human:不會被改變、在編譯器可知
// 變量man的動態類型 = 實例對象類型 = Man:會變化、在運行期才可知
}
}
即:
變量的靜態類型 = 引用類型 :不會被改變、在編譯器可知
變量的動態類型 = 實例對象類型 :會變化、在運行期才可知
下面 , 我將詳細講解Java中的分派類型:靜態分派 & 動態分派
靜態分派
定義
根據變量的靜態類型,進行方法分派的行為,即根據變量的靜態類型,確定執行哪個方法 。這一般發生在編譯期,所以不由 Java 虛擬機來執行 。
應用場景:方法重載(OverLoad)
實例說明:
public class Test {
// 類定義
static abstract class Human {
}
// 繼承自抽象類Human
static class Man extends Human {
}
static class Woman extends Human {
}
// 可供重載的方法
public void sayHello(Human guy) {
System.out.println(\"hello,guy!\");
}
public void sayHello(Man guy) {
System.out.println(\"hello gentleman!\");
}
public void sayHello(Woman guy) {
System.out.println(\"hello lady!\");
}
// 測試代碼
public static void main(String[] args) {
Human man = new Man;
Human woman = new Woman;
Test test = new Test;
test.sayHello(man);
test.sayHello(woman);
}
}
// 運行結果
hello,guy!
hello,guy!
根據上述的講解 , 大家應該明白運行結果的原因:
方法重載(OverLoad) = 靜態分派 = 根據變量的靜態類型確定執行(重載)哪個方法 。
所以上述的方法執行時 , 是根據變量(Man、Woman)的靜態類型(Human)確定重載sayHello中參數為Human guy的方法,即sayHello(Human guy)
特別注意變量的靜態類型發生變化的情況,遇到這種情況時,可通過強制類型轉換改變變量的靜態類型 。
Human man = new Man;
test.sayHello((Man)man);
// 強制類型轉換
// 此時man的靜態類型從 Human 變為 Man
// 所以會調用sayHello中參數為Man guy的方法,即sayHello(Man guy)

靜態分派的優先級匹配問題問題描述:
1、背景
現需要進行靜態分派 。
2、問題
程序中沒有顯示指定靜態類型 。
3、解決方案
程序會根據靜態類型的優先級,從而選擇優先的靜態類型進行方法分配 。
實例說明
public class Overload {
private static void sayHello(char arg){

相關經驗推薦