<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > “加哇”到底是不是一種純面向?qū)ο笳Z言?

          “加哇”到底是不是一種純面向?qū)ο笳Z言?

          作者: 時間:2016-07-19 來源:網(wǎng)絡(luò) 收藏

            “加哇”——是否確實的 “純

            在我剛開始學(xué)習(xí)“加哇”的前面幾年,我從書本里知道了 “加哇” 是遵循 “ 語言中,字符串是字符數(shù)組),那時候,我認為“加哇”是一種lass 對象。該 lass 對象在JVM內(nèi)僅僅會裝載一次,該類的靜態(tài)方法和靜態(tài)屬性也一同裝載,JVM使用該 Class 對象來創(chuàng)建具體的實例對象(如上面的對象)。

            例如,在下面的 “加哇” 語句中,將有兩個對象被創(chuàng)建:

            Employee emp = new Employee();

            一個是實例對象 emp ;另一個則是 Class對象,我們可以通過 Employee.class 引用到它;這個 Class 對象擁有所有的這個類定義的靜態(tài)變量和靜態(tài)方法,同時,如果我們訪問 通過 emp 對象來訪問靜態(tài)內(nèi)容,會發(fā)現(xiàn)它其實指向的對象就是 Employee.class 。

            這也揭開了另一個迷:為什么靜態(tài)內(nèi)容在一個對象中(不管是emp還是emp2)改變了,在另一個對象中也同時改變,因為這兩個對象改變的都是在 Employee.class 同一個對象里面的內(nèi)容。

            現(xiàn)在,上面說到的第一個論點我們要取消了。因為,靜態(tài)內(nèi)容確實被證實屬于一個對象。

            但是我們還要確認第二個論點:正如早前提到的,原始類型在“加哇”中不是對象,它們無法做類似對象的操作。為了解決這個問題,“加哇”官方為每一個原始類型推出了對應(yīng)的包裝類(比如:Integer 對應(yīng) int,Long 對應(yīng) long,Character 對應(yīng) char),所以,其實現(xiàn)在我們可以為原始類型創(chuàng)建一個包裝對象,同時對它們做對象相關(guān)的操作。并且,由于自動拆裝箱,我們可以把一個原始類型值賦值給它對應(yīng)的包裝類的引用。但是我們?nèi)匀徊荒軐@些原始類型做對象的操作——我們需要創(chuàng)建對應(yīng)包裝類的對象。

            例如:

            Integer obj = new Integer(5); // here we can do i.toString();

            int i = 5; // but we can't do i.toString() here

            到目前為止,從一個最終用戶的角度上來看的,我們可以確認 “原始類別不是對象”。( “加哇”開發(fā)人員是“加哇”的最終用戶,因為我們正在使用它,而不是創(chuàng)造它 )。

            如果站在JVM的視角,會有新的發(fā)現(xiàn):

            其實,在JVM看來它把所有的 “原始類型” 都是當作對象處理” ,要證明這一點可以通過 Class類的源代碼 或者“加哇”doc中Class類的說明。

            根據(jù)“加哇”.lang.Class 類的源代碼,該類的注釋是:

            “加哇”官方描述:

            Instances of the class Class represent classes and interfaces in a running J**a application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive J**a types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.

            參考譯文:

            Class類的實例表示正在運行的“加哇”應(yīng)用程序的類和接口。像枚舉是一種類和注解則是一種接口。每個數(shù)組也屬于被反射作為由具有相同的元素類型和尺寸的數(shù)目的所有陣列共享一類對象的類。原始的“加哇”類型(boolean, byte, char, short, int, long, float, and double)和關(guān)鍵字void也表示為Class對象。

            同時也根據(jù)“加哇”doc中對Class.isPrimitive()方法的定義,來判斷

            “加哇”官方描述:

            public boolean isPrimitive()

            Determines if the specified Class object represents a primitive type.

            There are nine predefined Class objects to represent the eight primitive types and void. These are created by the J**a Virtual Machine, and h**e the same names as t he primitive types that they represent, namely boolean,byte, char, short, int, long, float, and double.

            These objects may only be accessed via the following public static final variables, and are the only Class objects for which this method returns true.

            Returns:

            true if and only if this class represents a primitive type

            Since:

            JDK1.1

            參考翻譯:

            public boolean isPrimitive()

            判斷指定的Class對象是否代表一個基本類型。

            一共有9種設(shè)定好的Class對象來表示對應(yīng)的基本類型和void關(guān)鍵字。這些對象都是由JVM創(chuàng)建的。…

            return

            當且僅當該類表示一個真正的基本類型

            以上都說明,在JVM內(nèi)部,其實原始類型就是對象。

            當你打開 J**adoc 對 Class 類的定義中,通過 “CTRL+F ” 查找關(guān)鍵字 “primitive”, 將會發(fā)現(xiàn)證據(jù)在表面 “在JVM里,它把基本類型當作對象來處理的”。

            我們可以再來看一個例子: Integer.TYPE,在這部分文檔清晰記錄著:

            “加哇”官方描述:

            public static final Class TYPE

            The Class instance representing the primitive type int.

            以上都說明,在JVM內(nèi)部,其實原始類型就是對象。

            那么,既然說 “JVM”會為所有的基本類型創(chuàng)建一個對象,那我們?yōu)槭裁催€那么常用 “原始類型”, 而不是直接使用對應(yīng)的包裝類對象呢?

            這是因為,為 “原始類型” 創(chuàng)建的對象,在JVM內(nèi)部是很輕量級的,相對與我們直接創(chuàng)建的對應(yīng)包裝類對象做了許多優(yōu)化; 也正因為輕量的緣故,這些原始類的功能就比較少(例如我們不能調(diào)用其內(nèi)部的方法,因為他們內(nèi)部已經(jīng)優(yōu)化成沒有方法了)

            使用實際的例子來說明,為什么我們更應(yīng)該使用 “原始類型”:

            “原始類型”有更快的速度(例如,下面的代碼執(zhí)行,在我們的機器上需要9秒,但當我把 Long 改成 long 之后,0秒內(nèi)就完成了)

            public static void main(String[] args) {

            long millis = System.currentTimeMillis();

            Long sum = 0L; // uses Long, not long

            for (long i = 0; i <= Integer.MAX_VALUE; i++) {

            sum += i;

            }

            System.out.println(sum);

            System.out.println((System.currentTimeMillis() - millis) / 1000);

            }

            “原始類型”允許我們直接使用 “==”來進行比較

            new Integer(3) == new Integer(3); // false

            new Integer(100) == new Integer(100); // false

            Integer.valueOf(5) == Integer.valueOf(5); //true

            Integer.valueOf(200) == Integer.valueOf(200); //false

            我們注意看第四句,輸出結(jié)果確實為 “false” 。這個是因在 [-128; 127] 這個區(qū)間的265個整數(shù)會被 JVM 緩存存放, 所以在這個區(qū)間, JVM返回相同的對象;然而,超出這個區(qū)間, JVM就不再有緩存了,將會創(chuàng)建新的對象,所以結(jié)果是不等的。

            所以總結(jié)一下是: 在JVM內(nèi)部,原始類型就是被當作對象來處理的。但是我們開發(fā)者直接把 “原始類型” 當作對象使用,開發(fā)者應(yīng)該使用對應(yīng)的包裝來。

            以上就是為什么我說 “ “加哇”確實是一個純粹的面向?qū)ο笳Z言 ”的證實過程。如果你們對這個有什么其他的觀點,請在評論留言,一起討論,大家也可以微信關(guān)注華清遠見,回復(fù)“干貨”400元電子書相贈,每天下午5點30,精彩內(nèi)容喂飽你。

            注:因該語言易被屏蔽所以全文用中文名“加哇”。



          關(guān)鍵詞: C 面向?qū)ο?/a>

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();