1. 程式人生 > >JAVA的靜態分派和動態分派

JAVA的靜態分派和動態分派

靜態分派 :
以下是靜態分派的測試程式碼

public class StaticDispatch {
    static abstract class Human{}
    static class Man extends Human{}
    static class Woman extends Human{}
    public static void say(Human human){
        System.out.println("Human");
    }
    public static void say(Man man){
        System.out.println("Man"
); } public static void say(Woman woman){ System.out.println("Woman"); } public static void main(String []args){ Human h = new Man(); Human h2 = new Woman(); say(h);//輸出Human say(h2);//輸出Human say((Man)h);//輸出Man } }

我們把上面程式碼中的“Human”稱為變數的靜態型別(Static Type),或者叫做的外觀型別 (Apparent Type),後面的“Man”則稱為變數的實際型別(Actual Type),靜態型別和實際型別在程式中都可以發生一些變化,區別是靜態型別的變化僅僅在使用時發生,變數本身的靜態型別不會被改變,並且最終的靜態型別是在編譯期可知的;而實際型別變化的結果在執行期才可確定,編譯器在編譯程式的時候並不知道一個物件的實際型別是什麼。
動態分派(執行期根據實際型別確定方法執行版本的 分派過程):

public class DynamicDispatch {
    static abstract class Human{ 
        protected abstract void sayHello();
    } 
    static class Man extends Human{ 
        @Override 
        protected void sayHello(){ 
            System.out.println("man say hello"); 
        } 
    } 
    static class Woman
extends Human{
@Override protected void sayHello(){ System.out.println("woman say hello"); } } public static void main(String[]args){ Human man=new Man(); Human woman=new Woman(); man.sayHello();//輸出man say hello woman.sayHello();//輸出woman say hello man=new Woman(); man.sayHello();//輸出woman say hello } }

相關推薦

java多型的原理:靜態分派動態分派

1.靜態分派所有依賴靜態型別來定位方法執行版本的分派動作(Parent p=new Son();左邊的Parent就是變數的靜態型別,或者外觀型別)。靜態分派發生在編譯階段,重寫(overload)是典型例子。編譯器在編譯期並不知道物件的實際型別,實際型別只有在執行期才知道。

Java中的靜態分派動態分派

Java中的分派 首先需要理解一下靜態型別和動態型別。找了很多資料,沒有在java的書中找到關於這兩種型別的具體定義,但是在C++的書中找到了下面的定義,這可能就是java被稱為是 C++- 的原因之一吧。:) 靜態型別與動態型別 靜態型別:不需

JAVA靜態分派動態分派

靜態分派 : 以下是靜態分派的測試程式碼 public class StaticDispatch { static abstract class Human{} static class Man extends Human{} sta

(三十)分派調用:靜態分派動態分派

技術 args 不同 什麽 AI over src println override 分派調用 其實分派分為兩種,即動態分派和靜態分派。我們在了解分派的時候,通常把它們與重寫和重載結合到一起。 重載(overload)與靜態分派 我們先看一個題: public clas

java 靜態代理動態代理

www. 同時 訪問方式 自身 代理模式 動態 滿足 size 基礎 代理模式 一、概述   代理是一種模式,提供了對目標對象的間接訪問方式,即通過代理訪問目標對象。如此便於在目標實現的基礎上增加額外的功能操作,前攔截,後攔截等,以滿足自身的業務需求,同時代理模式便於擴展目

設計模式 - Java靜態代理動態代理

本篇部落格的由來,之前我們學習大話設計,就瞭解了代理模式,但為什麼還要說呢? 原因: 1,通過DRP這個專案,瞭解到了動態代理,認識到我們之前一直使用的都是靜態代理,那麼動態代理又有什麼好處呢?它們二者的區別是什麼呢? 2,通過學習動態代理了解到動態代理是一種符合AOP設計思想的技術,那

Java 靜態代理動態代理的使用及原理解析

代理模式是軟體開發中常見的設計模式,它的目的是讓呼叫者不用持有具體操作者的引用,而是通過代理者去對具體操作者執行具體的操作。 靜態代理的實現 操作介面: public interface Operate { void doSomething(); } 複製程式碼 操作者: public cla

java靜態分配動態分配

1.方法呼叫 先來說說java方法的呼叫,方法的呼叫不等於方法執行,方法呼叫階段唯一的任務是確定被呼叫方法的版本(即呼叫哪個方法,不是唯一的,確定一個“更加合適”的版本),不涉及方法內部的具體執行過

java靜態代理動態代理(一)

代理Proxy:  Proxy代理模式是一種結構型設計模式,主要解決的問題是:在直接訪問物件時帶來的問題。  代理是一種常用的設計模式,其目的就是為其他物件提供一個代理以控制對某個物件的訪問。代理類負責為委託類預處理訊息,過濾訊息並轉發訊息,以及進行訊息被委託類執行後的後續處理。 &

java靜態代理動態代理的區別

本篇部落格的由來,之前我們學習大話設計,就瞭解了代理模式,但為什麼還要說呢?原因:1,通過DRP這個專案,瞭解到了動態代理,認識到我們之前一直使用的都是靜態代理,那麼動態代理又有什麼好處呢?它們二者的區別是什麼呢?2,通過學習動態代理了解到動態代理是一種符合AOP設計思想的技

Java靜態代理動態代理

本篇部落格的由來,之前我們學習大話設計,就瞭解了代理模式,但為什麼還要說呢? 原因: 1,通過DRP這個專案,瞭解到了動態代理,認識到我們之前一直使用的都是靜態代理,那麼動態代理又有什麼好處呢?它們二者的區別是什麼呢? 2,通過學習動態代理了解到動態代理是一種符合AOP

Java中的靜態分派動態分派

    解析呼叫一定是個靜態過程,在編譯期間就完全確定,在類載入的解析階段就會把涉及的符號引用轉化為可確定的直接引用,不會延遲到執行期再去完成。而分派呼叫則可能是靜態的也可能是動態的,根據分派依據的宗量數(方法的呼叫者和方法的引數統稱為方法的宗量)又可分為單分派和多分派。兩類分派方式兩兩組合便構成了靜態單分派

Java靜態分派動態分派(二)

xiang oid main isp 準備 center 使用 name 編譯過程 方法調用並不等於方法執行,方法調用階段唯一的任務就是確定被調用方法的版本(即調用哪一個方法),暫時還不涉及方法內部的具體運行過程。 在程序運行時,進行方法調用是最普遍、最頻繁的操作,但是Cl

Java虛擬機器之‘靜態分派動態分派

Java是一門面向物件的語言,因為Java具備面向物件的三個特性:封裝、繼承、多型。分派的過程會揭示多型特性的一些最基本的體現,如“過載”和“重寫”在Java虛擬機器中是如何實現的,並不是語法上如何寫,我們關心的依然是虛擬機器如何確定正確的目標方法。 一、靜態分派 先看一段程式碼 pac

【深入Java虛擬機器(5)】:多型性實現機制—靜態分派動態分派

方法解析 Class檔案的編譯過程中不包含傳統編譯中的連線步驟,一切方法呼叫在Class檔案裡面儲存的都只是符號引用,而不是方法在實際執行時記憶體佈局中的入口地址。這個特性給Java帶來了更強大的動態擴充套件能力,使得可以在類執行期間才能確定某些目標方法的直接引

java分派靜態分派動態分派,雙重分派討論)

以上資訊來自於java修煉手冊(好書)概念:變數被宣告時的型別叫做變數的明顯型別,也稱為靜態型別變數所引用的物件的真實型別叫做實際型別靜態分派:發生在編譯時期,分配根據靜態型別發生,方法的過載就是靜態分派動態分派:發生在執行時期,動態的置換掉某個方法靜態分派例項講解:動態分派

Java靜態分派動態分派

牛客題: 以下程式碼執行的結果是多少()? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Java 8中的靜態代理動態代理的簡單心得

歡迎來到我的第一個部落格 個人學習的一點心得,第一次寫寫的不好見諒 看看程式碼吧 程式碼1. public interface CarSales { void sell(); } 程式碼2. public class QQCar implements

Java設計模式之代理模式的靜態代理動態代理

前言 代理模式分為靜態和動態。同時靜態代理又分為普通代理和強制代理。因此本文會通過示例的方式詳細介紹著三種代理模式。我們依然以網上購物為例。   普通代理 定義:要求客戶端只能訪問代理角色,而不能直接訪問真實角色。我們需要修改真實角色: 1 public class RealCon

java中的代理(靜態代理動態代理)

之前本人在設計模式中有寫過靜態代理和動態代理的相關程式碼測試,可以看下。 今天我們主要學一下理論相關知識。 AOP的原理就是動態代理機制。RPC框架也是實現了AOP機制。 靜態代理 靜態代理:在程式碼編譯時就確定了被代理的類是哪一個。 這個靜態代理比較簡單,代理類和被代