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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java代码编写出现的陷阱-1:警惕变长参数

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java代码编写出现的陷阱-1:警惕变长参数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Java5 中提供了變長參數(varargs),也就是在方法定義中可以使用個數不確定的參數,對于同一方法可以使用不同個數的參數調用,調用的時候可以給出任意多個參數也可不給參數.

method(Object...objs){...} . ?調用時的代碼是:method("str") 或者method(null),method("張三","李四","王五").

但是如果出現下面的情況,可就麻煩了,不多說,看代碼:

  • public class Client { ? ?

  • ? ? //簡單折扣計算 ?

  • ? ? public void calPrice(int price,int discount){ ?

  • ? ? ? ? ? float knockdownPrice =price * discount / 100.0F; ?

  • ? ? ? ? ? System.out.println("折扣后的價格:"+formateCurrency(knockdownPrice)); ?

  • ? ? } ? ?

  • ? ? //復雜多折扣計算(出現在折上折需求上)

  • ? ?public void calPrice(int price,int... discounts){ ?

  • ? ? ? ? ? float knockdownPrice = price; ?

  • ? ? ? ? ? for(int discount:discounts){ ?

  • ? ? ? ? ? ? ? ?knockdownPrice = knockdownPrice * discount / 100; ?

  • ? ? ? ? ? } ?

  • ? ? ? ? ? ? System.out.println("折上折后的價格:"+formateCurrency(knockdownPrice));

  • ? ?} ?

  • ? ? //格式化成本的貨幣形式 ?

  • ? ? private String formateCurrency(float price){ ?

  • ? ? ? ? ? ?return NumberFormat.getCurrencyInstance().format(price/100); ?

  • ? ? } ?

  • ? ? public static void main(String[] args) { ?

  • ? ? ? ? ? Client client = new Client(); ?

  • ? ? ? ? ? //499元的貨物,打75折

  • ? ? ? ? ? client.calPrice(49900, 75); ?

  • ? ? } ?

  • ? ?程序調用了最終調用了非變長參數的方法,因為java在編譯時,首先會根據實參的數量和類型來進行處理,而且確定是否符合方法簽名條件,而兩個重載方法中,int類型的是一個原生數據類型,而多變參數實際上是一個數組對象,編譯器偷懶,于是先從簡單的方法簽名開始,如果符合條件,即可編譯通過,于是就出現了這種情況。

    下面變長參數方法還有一種情況挺煩人的,看代碼:

  • public class Client {

  • ? ? public void methodA(String...strs){ }

  • ? ? public void methodA(Integer...ints){ }

  • ? ? public static void main(String[] args) { ?

  • ? ? ? ? ? Client client = new Client(); ?

  • ? ? ? ? ? //調用方法

  • ? ? ? ? ? client.methodA(null); ? ?//編譯出錯

  • ? ? } ?

  • 為什么會編譯編譯出錯了,兩個方法重載是沒問題的,但是在調用時,傳入的參數直接使用實參數值,這樣java編譯器無法判斷null屬于何種數據對象.不僅僅調用者需要"猜測"該調用哪個方法,而且被調用者也可能產生內部邏輯混亂的情況.

    這個問題的解決方案有兩種:

    <1> 調用methodA方法時,設置null一個類型,將變量作為參數傳入.

    <2> methodA方法不重載,將其中的一個方法名改掉.



    轉載于:https://blog.51cto.com/javacrazy/1375511

    總結

    以上是生活随笔為你收集整理的java代码编写出现的陷阱-1:警惕变长参数的全部內容,希望文章能夠幫你解決所遇到的問題。

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