Java中的靜態分派和動態分派
Java中的分派
首先需要理解一下靜態型別和動態型別。找了很多資料,沒有在java的書中找到關於這兩種型別的具體定義,但是在C++的書中找到了下面的定義,這可能就是java被稱為是 C++- 的原因之一吧。:)
靜態型別與動態型別
- 靜態型別:不需要考慮表示式執行期的語義,僅從表示式的字面的形式就能夠決定的型別,在編譯期確定的變數型別,並且在執行期不會改變。
- 動態型別:由一個左值表示式指出的左值的動態型別,是其所引用的物件的最狹義型別,在執行期決定具體的變數型別,可以在執行期改變。即:基類引用所引用的物件的實際型別。
左值和右值
按字面意思,通俗地說。以賦值符號 = 為界,= 左邊的就是左值,= 右邊就是右值。
比如:(1) int b = 3;(2) int a =b;第(2)行程式碼,a為左值,b為右值。
-
更深一層,可以將 L-value 的 L, 理解成 Location,表示定位,地址。將R-value 的 R 理解成Read,表示讀取資料。現在的計算機資料放在記憶體。記憶體有兩個很基本的屬性:記憶體地址和記憶體裡面放的資料。想象完全一樣的箱子。每個箱子有個編號,用來區分到底是哪個箱子,箱子裡面可以放東西。記憶體地址相當於箱子的編號,記憶體的資料,相當於箱子裡面放的東西。
-
變數名編譯之後,會對映成記憶體地址。看看a = b的含義。其實就是 將 “b地址記憶體裡面的資料”,放到”a地址記憶體”中。
——百度百科
靜態分派和動態分派
靜態分派:
- 依賴靜態型別 確定方法執行版本的分派。[ 判斷引數是什麼型別]
- 編譯期發生。
動態分派:
- 依賴實際型別 確定方法執行版本的分派。[ 判斷實際物件是什麼型別]
- 向上轉型後呼叫子類重寫的方法。
- 執行期(根據實際型別)決定。
靜態分派示例:
/**
* Create by zhaihongwei on 2018/4/8
*/
public class StaticDispatch {
public void sayHello(People people) {
System.out.println("你好,我是人!" );
}
public void sayHello(China china) {
System.out.println("你好,我是中國人!");
}
public void sayHello(American american) {
System.out.println("你好,我是美國人!");
}
}
/**
* Create by zhaihongwei on 2018/4/8
*/
public class People {
}
/**
* Create by zhaihongwei on 2018/4/8
*/
public class China extends People {
}
/**
* Create by zhaihongwei on 2018/4/8
*/
public class American extends People{
}
測試類:
/**
* Create by zhaihongwei on 2018/4/8
*/
public class Test {
public static void main(String[] args) {
StaticDispatch dispatch = new StaticDispatch();
People people = new People();
People china = new China();
People american = new American();
dispatch.sayHello(people);
dispatch.sayHello(china);
dispatch.sayHello(american);
}
}
測試結果:
你好,我是人!
你好,我是人!
你好,我是人!
動態分派示例:
/**
* Create by zhaihongwei on 2018/4/8
*/
public class People {
public void sayHello() {
System.out.println("你好,我是人!");
}
}
/**
* Create by zhaihongwei on 2018/4/8
*/
public class China extends People {
@Override
public void sayHello() {
System.out.println("你好,我是中國人!");
}
}
/**
* Create by zhaihongwei on 2018/4/8
*/
public class American extends People{
@Override
public void sayHello() {
System.out.println("你好,我是美國人!");
}
}
測試類:
/**
* Create by zhaihongwei on 2018/4/8
*/
public class Test {
public static void main(String[] args) {
People people = new People();
People china = new China();
People american = new American();
people.sayHello();
china.sayHello();
american.sayHello();
}
}
測試結果:
你好,我是人!
你好,我是中國人!
你好,我是美國人!
結論:
從上面的例子看出,變數的動態型別(實際型別)是在執行期確定的,過載方法是根據引數靜態型別選擇對應方法,重寫方法的呼叫是根據動態型別來呼叫的。即:JAVA中過載為靜態風派,重寫為動態分派。
相關推薦
java中靜態資源和動態資源的區別
靜態資源:html,屬於客戶端 動態資源:jsp/servlet屬於伺服器端 一、靜態web頁面: 1、在靜態Web程式中,客戶端使用Web瀏覽器(IE、FireFox等)經過網路(Network)連線到伺服器上,使用HTTP協議發起一個請求(Request),告訴
Java中的靜態分派和動態分派
Java中的分派 首先需要理解一下靜態型別和動態型別。找了很多資料,沒有在java的書中找到關於這兩種型別的具體定義,但是在C++的書中找到了下面的定義,這可能就是java被稱為是 C++- 的原因之一吧。:) 靜態型別與動態型別 靜態型別:不需
java多型的原理:靜態分派和動態分派
1.靜態分派所有依賴靜態型別來定位方法執行版本的分派動作(Parent p=new Son();左邊的Parent就是變數的靜態型別,或者外觀型別)。靜態分派發生在編譯階段,重寫(overload)是典型例子。編譯器在編譯期並不知道物件的實際型別,實際型別只有在執行期才知道。
JAVA的靜態分派和動態分派
靜態分派 : 以下是靜態分派的測試程式碼 public class StaticDispatch { static abstract class Human{} static class Man extends Human{} sta
(三十)分派調用:靜態分派和動態分派
技術 args 不同 什麽 AI over src println override 分派調用 其實分派分為兩種,即動態分派和靜態分派。我們在了解分派的時候,通常把它們與重寫和重載結合到一起。 重載(overload)與靜態分派 我們先看一個題: public clas
wpf中靜態資源和動態資源的區別
一次 div font size res static 靜態 mil source 靜態資源(StaticResource)指的是在程序載入內存時對資源的一次性使用,之後就不再訪問這個資源了。 動態資源(DynamicResource)指的是在程序運行過程中然會去訪問資源。
java中靜態方法和非靜態方法的區別
靜態方法和非靜態方法主要有兩個區別: 1.在外部呼叫靜態方法時,可以使用"類名.方法名"的方式,也可以使用"物件名.方法名"的方式。而例項方法只有後面這種方式。也就是說,呼叫靜態方法可以無需建立物件。 2.靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而
25(java中的反射和動態代理)
1 概述 反射獲取的都是class物件,以下是在不同的階段獲取物件的方式。 2 原始檔階段class物件的作用 可以利用全類名創造物件,具體程式碼為: 3 class物件獲取類中的欄位(即成員變數) 註釋:通過Class.forName()獲取到了Pe
Java的靜態代理和動態代理
什麼是代理 什麼是代理呢,其實很好理解,就是不直接訪問目標,而是通過一箇中間層來訪問,就好像下面這樣: Java的靜態代理 舉個例子,如果我們一些水果,比如:香蕉、蘋果等,寫成Java程式碼,大概是下面這個樣子: //Fruit.java /** * 水果
Java的靜態載入和動態載入區別
一、首先是說java的靜態載入: 1.建立了幾個類,“老師”、“學生”、“職員”,每個人群有個屬性方法,程式碼如下: public class Student { public void belongNature() { Syst
java中靜態變數和成員變數的區別
所屬不同:靜態變數屬於類,所以也稱為為類變數;成員變數屬於物件,所以也稱為例項變數(物件變數)在記憶體中位置不同:靜態變數儲存於方法區裡的靜態區;成員變數儲存於堆記憶體區在記憶體中出現的時間不同:靜態變
java中靜態類和靜態變數和靜態方法分別有什麼特點?
一、static 請先看下面這段程式:public class Hello{ public static void main(String[] args){ //(1) System.out.println("Hello,world!"); //(2
Java中靜態常量和靜態變數的區別
如下:測試java中靜態常量和靜態變數區別的樣例,表明兩者載入時的區別。StaticClass類中定義了靜態常量FIANL_VALUE和靜態變數VALUE,靜態程式碼塊的列印語句表示類被載入:publi
JSP中靜態包含和動態包含的區別?
主要從以下5方面進行分析: 1.語法: 靜態包含:<%@ include file=""%> 動態包含:<jsp: include page=""%> 2.靜態包含時,包含
Java中靜態變數和非靜態變數的初始化順序
先看下面的程式: package c05.net; class Bowl {Bowl(int marker) {System.out.println("Bowl(" + marker + ")");} void f1() {System.out.println("Ok")
c++中靜態庫和動態庫的建立與連結
2、動態庫 在使用動態庫的時候,往往提供兩個檔案:一個引入庫(.lib)和一個DLL(.dll)檔案。雖然引入庫的字尾也是.lib ,但是動態庫的引入庫檔案和靜態庫檔案有著本質的區別,對一個DLL來說,其引入庫檔案(.lib)包含DLL匯出的函式和變數的符號名,而.dll檔案包含該DLL實際的函式
web中靜態資源和動態資源的概念及區別
1.靜態資源和動態資源的概念 簡單來說: 靜態資源:一般客戶端傳送請求到web伺服器,web伺服器從記憶體在取到相應的檔案,返回給客戶端,客戶端解析並渲染顯示出來。 動態資源:一般客戶端請求的動態資源,先將請求交於web容器,web容器連線資料庫,資料庫處理資料之後,將內容
廣告行業中靜態創意和動態創意區別
靜態創意:在投放時,通過選擇事先上傳到 adx伺服器的創意進行投放,這種形式叫靜態創意投放。 動態創意:在投放時,通過在 response 中的 html_snippet 欄位中填寫 html 程式
java梳理-靜態代理和動態代理有什麼區別
一 概念 為某個物件提供一個代理,以控制對這個物件的訪問。 代理類和委託類有共同的父類或父介面,這樣在任何使用委託類物件的地方都可以用代理物件替代。代理類負責請求的預處理、過濾、將請求分派給委託類處理、以及委託類執行完請求後的後續處理。 代理模式是經典設計模式中的一種,屬於物件建立型設計模式。
Hive中靜態分割槽和動態分割槽總結
## 目錄 - 背景 - 第一部分 靜態分割槽 - 第二部分 動態分割槽 - 第三部分 兩者的比較 - 第四部分 動態分割槽使用的問題 - 參考文獻及資料 ## 背景 在`Hive`中有兩種型別的分割槽:靜態分割槽(Static Partitioning)和動態分割槽(Dynamic Partitio