亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將字節參數傳遞給重載方法

將字節參數傳遞給重載方法

holdtom 2023-09-27 17:23:19
我從一些測驗中獲取了這段代碼片段,使用 IDE 執行了它并得到了很長很長的結果,但正確的答案是Byte, Byte,為什么我得到不同的結果?該問題與 JDK 11 有關public class Client {    static void doCalc(byte... a) {         System.out.print("byte...");     }    static void doCalc(long a, long b) {         System.out.print("long, long");     }    static void doCalc(Byte s1, Byte s2) {         System.out.print("Byte, Byte");     }    public static void main(String[] args) {             byte b = 5;         doCalc(b, b);     } }編輯:代碼取自此處:Oracle 認證概述和示例問題 (頁:13,問題:5)
查看完整描述

3 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

因此,如果您仔細閱讀用于在編譯時確定方法簽名的 Java 語言規范,就會清楚:

  1. 第一階段(第 15.12.2.2 節)執行重載解析,不允許裝箱或拆箱轉換或使用變量 arity 方法調用。如果在此階段沒有找到適用的方法,則處理繼續到第二階段。

  2. 第二階段(第 15.12.2.3 節)執行重載解析,同時允許裝箱和拆箱,但仍然阻止使用變量 arity 方法調用。如果在此階段沒有找到適用的方法,則處理繼續到第三階段。

  3. 第三階段(第 15.12.2.4 節)允許重載與可變數量方法、裝箱和拆箱相結合。

因此,從上述步驟中可以清楚地看出,在您的情況下,在第一階段,?Java 編譯器將找到一個匹配的方法,該方法可以執行doCalc(long a,long b).?您的方法doCalc(Byte s1, Byte s2)在調用期間需要自動裝箱,因此它的優先級會降低。


查看完整回答
反對 回復 2023-09-27
?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

在您的情況下發生的情況是,在運行時,JVM 選擇執行擴大轉換?byte -> long,因為這種轉換更安全,因為可以保證它不會導致RuntimeException.

從 轉換為byteByte稱為裝箱可能會導致OutOfMemoryError,因為 JVM 必須將新對象分配到堆上:

如果需要分配包裝類(Boolean、Byte、Character、Short、Integer、Long、Float 或 Double)之一的新實例并且可用存儲空間不足,則裝箱轉換可能會導致 OutOfMemoryError。

因此,首選更安全的byte -> long?加寬轉換。


查看完整回答
反對 回復 2023-09-27
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

為了找到正確的過載,順序是:

  1. 按參數數量

  2. 裝箱/拆箱

  3. 可變參數

所以

  • 如果b結果ByteByte, Byte.

  • 如果通過的話,new byte[] { b, b }結果就是byte, byte

  • 如果傳遞兩個字節 b,則可以從 byte擴展到 int 到 long,結果為long, long。

  • 當長長的超載被移除時,Byte, Byte就會產生結果。


查看完整回答
反對 回復 2023-09-27
  • 3 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號