1. 程式人生 > >編譯時期和執行時期的區別

編譯時期和執行時期的區別

     最近在看多型,裡面有一句話困擾了我很久,就是

    編譯時型別和執行時型別
    ps:多型定義:把子類物件直接賦給父類的引用時,當執行時呼叫該引用型別的方法時,其方法行為總是表現出子類的行為特徵,而不是父類的行為特徵,這就出現了同一引用呼叫引用變數帶的方法是,表現出不同的特徵,這就是多型。 
    我一直都對這個編譯時型別和執行時型別很迷惑,百度了很多講的都很淺顯大都如下:


Java的引用變數有兩個型別,一個是編譯時型別,一個是執行時型別,編譯時型別由宣告該變數時使用的型別決定,執行時型別由實際賦給該變數的物件決定。


這樣的說法只是簡單地描述了編譯時型別、執行時型別,並沒有真正的從本質上說明什麼是編譯時型別什麼是執行時型別。最終我還是找到了一篇寫的比較好的文章,拷貝其中的一段給大家看看,外加上自己的程式碼
Person p=new Women()(Women類繼承自Person類)那麼,假如p的屬性修飾符為public 訪問屬性時得到的是Person類的屬性還是Women類的屬性,方法呼叫又是哪個類?答案:會得到Person類的屬性,呼叫Women類的方法。為什麼會這樣呢?這裡就需要知道什麼是編譯時型別和執行時型別,Java程式狀態會分為編譯和執行這兩種狀態,編譯時,JVM會在棧中靜態建立基本資料變數,和引用資料變數的引用,回到剛剛那句程式碼,顯然,p這個引用就是在編譯時建立的,那麼,p的編譯時型別就是Person了,當執行這句java程式碼時,JVM在堆中為p新建一塊記憶體,對應new Women()這句程式碼,所以p的執行時型別就是Women
這篇文章的地址在這大家可以去看看原版文章寫得非常好。http://blog.csdn.net/qq_23419401/article/details/52064871#java
下面我就要發表一下自己的看法了。我們都知道棧和堆,在棧中存放的是一些引用和一些變數,而堆記憶體中存放的是物件。

所以:編譯時期可以理解為堆記憶體中還沒有為該物件建立記憶體,只是在棧中建立了一些基本型別的變數和引用,所以編譯時型別就是指在new該物件之前被載入到棧中的屬性或方法。而執行時型別,是指new了一個物件出來,在棧中為該物件分配了記憶體,此時的執行時型別也就是棧中物件的屬性或方法了。
 Person person = new student();

這裡就可以很好地理解編譯時型別和執行時型別了。
編譯時型別是Person,當new了一個物件之後,堆記憶體中產生了一個Student物件,此時的型別就是執行時型別,也就是Student型別了。

這裡需要補充的是,在多型中,將子類物件賦給父類的引用,會產生多型。
Father son = new Son();

而這裡的son只能呼叫Father的方法(重寫或者繼承的方法),而不能呼叫本身定義的一些方法(自己編寫的父類中沒有的方法)。例如下面這樣就會報錯。

public class Father {
    public String name;
    public Father(){
        this.name = "father";
    }
    public void show(){
        System.out.println("father's name : " + this.name);
    }
}



public class Son extends
Father {
public String name; public Son(){ this.name = "son"; } public void show(){ System.out.println("Son's name: " + this.name); } public void show2(){ System.out.println("show2"); } public static void main(String[] args) { Father son = new
Son(); son.show2();//此處就會報錯 } }
1因為多型中強調:編寫java程式時,引用型別變數只能呼叫其編譯時型別的變數,不能呼叫其執行時型別變數。此時的show2()就是執行時型別的變量了。所以會報錯

相關推薦

編譯時期執行時期區別

最近在看多型,裡面有一句話困擾了我很久,就是 編譯時型別和執行時型別 ps:多型定義:把子類物件直接賦給父類的引用時,當執行時呼叫該引用型別的方法時,其方法行為總是表現出子類

C++學習-編譯執行區別

編譯:包括編譯和連結兩個過程。編譯:把原始檔(程式碼)轉換成機器可以識別的二進位制語言,這個過程是針對每一個原始檔的。連結:把編譯生成的二進位制檔案,組合成為一個系統可以執行的可執行檔案。這兩部分整體也叫編譯。也就是說,廣義的編譯,就是把程式碼,轉換成可執行檔案。執行:把編譯出來的可執行檔案,在系統中執行的過

在Editplus中配置java的(帶包)編譯(javac)執行(java)的方法

會有 post 快捷方式 java程序 技術分享 不能 安裝路徑 一行 提示符 配置的前提是電腦安裝了JDK而且配置好了相關的環境變量(JAVA_HOME,path和classpath)。 配置好後在命令行中輸入javac和java驗證是否配置成功: 假設出現上

淺談java編譯型別執行型別

背景:去某五星級酒店面試vi**,面試官拿出一段程式碼然購物寫輸出結果。考察點是:編譯型別和執行型別以及過載和覆蓋 話不多說,程式碼如下: class A{ public void show(A obj){ System.out.println(

python編譯過程執行原理

一、編譯過程概述  當我們執行Python程式碼的時候,在Python直譯器用四個過程“拆解”我們的程式碼,最終被CPU執行返回給使用者。  首先當用戶鍵入程式碼交給Python處理的時候會先進行詞法分析,例如使用者鍵入關鍵字或者當輸入關鍵字有誤時,都會被詞法分析所觸發,不正確的程式碼將不會被執行。  下一步

深入編譯連結執行

我們先看下面這份程式碼: #include<stdio.h> int gdata1=10; int gdata2=0; int gdata3; static int gdata4=11;

linux——shell中“.” “./”執行區別

linux 中在shell中使用 " . " 和  " ./ " 執行的區別 目前注意到的區別主要在於環境變數的作用域上: 1. 如果使用" ./ " 執行,可以理解為程式執行在一個全新的shell中,不繼承當前shell的環境變數的值, 同時若在程式中改變了當前shell中的

編譯錯誤執行錯誤;

編譯錯誤指的是你寫程式碼不規範,語法錯誤(簡單說就是你程式碼這麼寫沒有問題,但是你知道會在執行時候報錯)和一些很明顯的錯誤。執行錯誤是指程式碼邏輯錯誤,報異常。 DataStream有什麼用 存取物件

C/C++程式編譯執行時記憶體區域分配

         3.heap區,存放內容和上文同。值得說明的是:stack區起始地址是在高地址,即是從高地址向低地址延伸。而heap區起始地址是在低地址,即是從低地址向高地址延伸。總結:stack起始地址固定在高地址,heap起始地址固定在低地址,然後兩個區都向中間延伸。直到stack區和heap區的結束

Java jvm 載入機制及 其中解釋執行編譯執行區別

jvm載入機制 https://www.cnblogs.com/Qian123/p/5707562.html https://www.cnblogs.com/lingz/archive/2018/07/31/9394238.html 以前有句話說:“Java是解釋執行的 ” 。現在看

編譯執行解釋執行區別

解釋執行: 由直譯器根據輸入的資料當場執行而不生成任何的目標程式. 解釋執行程式是高階語言翻譯程式的一種,它將源語言(如BASIC)書寫的源程式作為輸入,解釋一句後就提交計算機執行一句,並不形成目標程式。這種工作方式非常適合於人通過終端裝置與計算機會話,如

解釋執行編譯執行區別、基於棧基於暫存器的指令集區別

1. 解釋執行和編譯執行的區別 我們在學習java的時候,對class檔案都有個疑惑,虛擬機器是如何執行發方法中的位元組碼指令的呢?其實 虛擬機器的執行引擎在執行java程式碼的時候有解釋執行和編譯執行兩種選擇。通俗說來,解釋執行是通過直譯器執行,編譯執行即通

編譯時異常執行時異常的區別

最簡單的說法: javac出來的異常就是編譯時異常,就是說把原始碼編譯成位元組碼(class)檔案時報的異常,一般如果用Eclispe,你敲完程式碼儲存的時候就是編譯的時候。java出來的異常就是執行時異常 Java異常可分為3種:   (1)編譯時異常:Java.

異常:編譯時異常執行時異常&throwthrows區別try-catch的應用

1、編譯時被檢測異常:只要是Exception和其子類都是,除了特殊子類:RuntimeException體系;這種問題一旦出現,希望在編譯時就進行檢測,讓這種問題有對應的處理方式。 2、編譯時不檢測的異常(執行時異常):就是Exception中的Runtim

Linux鞏固記錄(1) java項目的編譯執行

mce frame cati readfile 知識 4.3 sse apach ast 由於要近期使用hadoop等進行相關任務執行,操作linux時候就多了 以前只在linux上配置J2EE項目執行環境,無非配置下jdk,部署tomcat,再通過docker或者jenk

java --代碼編譯執行的整個過程

pan home 面向 share 簡單的 下一條 c++ oot 註解 1. 什麽是 JVM   JVM 是 Java 的核心和基礎,在 Java 編譯器和 os 平臺之間的虛擬處理器。它是一種基於下層的操作系統和硬件平臺並利用軟件方法來實現的抽象的計算機,可以在上面執行

oracle 執行計劃 accessfilter的區別

lte rownum only 而且 ply ready 很多 結果 rds These two terms in the Predicate Information section indicate when the data source is reduced. Sim

window下如何使用文本編輯器(如記事本)創建、編譯執行Java程序

得到 輸入 ava 執行 world! ext tex 目錄 源代碼 window下如何使用文本編輯器(如記事本)創建Java源代碼文件,並編譯執行 第一步:在一個英文目錄下創建一個 .text 文件 第二步:編寫代碼 第三步:保存文件 選擇 文件>另

select count(*)、count(1)、count(0)的區別執行效率比較

rst 區別 如果 定性 count(0 決定性 計算 fir 執行 區別 執行效率比較 執行效率從高到低 count(*)=count(1)=count(0)>count(colFirst)>count(colLast) 1.由於count(*)的算法

JVM原理(Java代碼編譯執行的整個過程+JVM內存管理及垃圾回收機制)

變化 並行 colspan 同時 簡單的 table 目前 動態 中心 轉載註明出處: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特點主要是指操作系統裝入JVM是通過jdk中Java.ex