日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自动装箱

發布時間:2023/12/3 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自动装箱 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自Java 1.5起,所有Java開發人員都可以使用自動裝箱功能。嗯,我可能太樂觀了。 至少所有開發人員都應該可以使用自動裝箱。 畢竟,在ORACLE頁面上有一個很好的教程。

自動裝箱是Java編譯器在需要時自動從原始類型創建代碼創建對象的代碼時的現象。 例如,您可以編寫:

Integer a = 42;

它將自動生成將值int 42放入Integer對象的JVM代碼。 編譯器為我們做到這一點真是太好了,以至于一段時間后,程序員往往會忘記它背后的復雜性,而我們有時會碰壁。

例如,我們有double.class和Double.class 。 它們都是對象(作為一個類,每個類本身都是permgen中的對象,或者只是后permgen版本的JVM中的堆)。 這兩個對象都是Class類型。 而且,由于Java 1.5都屬于Class<Double>類型。

如果兩個對象具有相同的類型,那么它們也必須是賦值兼容的。 似乎是一個顯而易見的陳述。 如果您有對象O a和對象O b則可以指定a = b 。

查看代碼,但是我們可能會發現遺忘而不是顯而易見:

public class TypeFun {public static void main(String[] args) {// public static final Class<Double> TYPE = (Class<Double>)Class.getPrimitiveClass("double");System.out.println("Double.TYPE == double.class: " + (Double.TYPE == double.class));System.out.println("Double.TYPE == Double.class: " + (Double.TYPE == Double.class));System.out.println("double.class.isAssignableFrom(Double.class): " + (double.class.isAssignableFrom(Double.class)));System.out.println("Double.class.isAssignableFrom(double.class): " + (Double.class.isAssignableFrom(double.class)));} }

結果:

Double.TYPE == double.class: true Double.TYPE == Double.class: false double.class.isAssignableFrom(Double.class): false Double.class.isAssignableFrom(double.class): false

這意味著Double的原始對是double.class (不足為奇)。 即使不能從另一個分配一個。 我們至少可以查看其中之一的來源。 Double類的源代碼位于RT.jar中,并且是開源的。 在那里,您可以看到:

public static final Class<Double> TYPE = (Class<Double>) Class.getPrimitiveClass("double");

為什么使用奇怪的Class.getPrimitiveClass("double")而不是double.class ? 那是Double類型的原始對。

答案并不簡單,您可以深入研究Java和JVM的細節。 由于double不是一個類,因此實際上沒有比double.class了。 但是,您仍然可以在Java源代碼中使用此文字,并且Java語言,編譯器和運行時具有很強的約束力。 編譯器知道Double類定義了一個名為TYPE的字段,該字段表示其原始類型。 每當編譯器在源代碼中看到double.class ,它都會生成JVM代碼Double.TYPE (嘗試一下,然后使用javap解碼生成的代碼!)。 因此,RT的開發人員無法編寫:

public static final Class<Double> TYPE = double.class;

進入Double類的源代碼。 它將編譯為等效的代碼:

public static final Class<Double> TYPE = TYPE;

那么自動裝箱如何進行? 來源:

Double b = (double)1.0;

結果:

0: dconst_1 1: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;4: astore_1

但是,如果我們替換兩個“ d”字母:

double b = (Double)1.0;

然后我們得到:

0: dconst_1 1: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;4: invokevirtual #3 // Method java/lang/Double.doubleValue:()D7: dstore_1

進食可以解釋很多事情。 double.class類和Double.class類的實例不分配兼容。 自動裝箱解決了這個問題。 Java 4很久以前了,幸運的是,我們忘記了它。

您的作業:重讀具有“類”類型和相應原始類型參數的方法時,重讀與自動裝箱相關的事情。

翻譯自: https://www.javacodegeeks.com/2014/09/autoboxing.html

總結

以上是生活随笔為你收集整理的自动装箱的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。