Java方法傳參,測試在方法內部改變參數內容是否會影響到原值


我分了三種類型的參數進行測試

一、基本類型

    public static void main(String[] args) {
        System.out.println("驗證基本類型int作為參數傳入方法中進行修改后原值是否會改變");
        int item1 = 1;
        System.out.println("int:改變前值為" + item1);
        changeInt(item1);
        System.out.println("int:類型改變后值為" + item1);
        System.out.println("-------------------------------------------------------");

    }

    private static void changeInt(int param) {
        param = 10;
        System.out.println("int:方法中值為" + param);
    }

打印結果:

 這里我用的是int,基本類型算是比較簡單明了,傳入方法的參數是int item1的值拷貝,所以方法內改變的不是item1。

 

二、 引用類型

    public static void main(String[] args) {
        System.out.println("驗證引用類型ItemModel作為參數傳入方法中進行修改后原值是否會改變");
        System.out.println("第一次測試");
        ItemModel item4 = new ItemModel("xiao ming");
        System.out.println("ItemModel:改變前對象的hashCode為" + System.identityHashCode(item4) + "   值為" + item4.toString());
        changeItemModel1(item4);
        System.out.println("ItemModel:改變后對象的hashCode為" + System.identityHashCode(item4) + "   值為" + item4.toString());

        System.out.println("第二次測試");
        ItemModel item5 = new ItemModel("xiao ming");
        System.out.println("ItemModel:改變前對象的hashCode為" + System.identityHashCode(item5) + "   值為" + item5.toString());
        changeItemModel2(item5);
        System.out.println("ItemModel:改變后對象的hashCode為" + System.identityHashCode(item5) + "   值為" + item5.toString());
        System.out.println("-------------------------------------------------------");

    }

    private static void changeItemModel1(ItemModel param) {
        param.setName("xiao hong");
        System.out.println("ItemModel:方法中對象的hashCode為" + System.identityHashCode(param) + "   值為" + param);
    }

    private static void changeItemModel2(ItemModel param) {
        param = new ItemModel();
        param.setName("xiao hong");
        System.out.println("ItemModel:方法中對象的hashCode為" + System.identityHashCode(param) + "   值為" + param);
    }

class ItemModel {

    private String name;

    public ItemModel() {

    }

    ItemModel(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "ItemModel{" +
                "name='" + name + '\'' +
                '}';
    }
}

打印結果:

 

 這里我打印了ItemModel的hashCode和toString方法,我們可以看到在第一次測試中,改變前、方法中、改變后對象的hashCode的是一樣的,所以我們可以確認傳入方法的是對象的引用,所以這一次原對象發生改變。在第二次測試的方法中,多了一行

param = new ItemModel();

這里一行是新創建了一個ItemModel對象,param被賦予了新的引用地址,所以能看到打印出的hashCode和原本是不一樣的,所以第二次測試中原對象並沒有被改變。

 

三、String 和 Integer

這里提一點,String和Integer對象都是不可改變的,每次重新賦值都是指向一個新的引用而已(可以參考上面的第二次測試)

    public static void main(String[] args) {
        System.out.println("驗證引用類型Integer作為參數傳入方法中進行修改后原值是否會改變");
        Integer item2 = new Integer(1);
        System.out.println("Integer:改變前對象的hashCode為" + System.identityHashCode(item2) + "   值為" + item2);
        changeInteger(item2);
        System.out.println("Integer:改變后對象的hashCode為" + System.identityHashCode(item2) + "   值為" + item2);
        System.out.println("-------------------------------------------------------");

        System.out.println("驗證引用類型String作為參數傳入方法中進行修改后原值是否會改變");
        String item3 = "xiao ming";
        System.out.println("String:改變前對象的hashCode為" + System.identityHashCode(item3) + "   值為" + item3);
        changeString(item3);
        System.out.println("String:改變后對象的hashCode為" + System.identityHashCode(item3) + "   值為" + item3);
        System.out.println("-------------------------------------------------------");

    }

    private static void changeInteger(Integer param) {
        param = 10;
        System.out.println("Integer:方法中對象的hashCode為" + System.identityHashCode(param) + "   值為" + param);
    }

    private static void changeString(String param) {
        param = "xiao hong";
        System.out.println("String:方法中對象的hashCode為" + System.identityHashCode(param) + "   值為" + param);
    }

打印結果:

 

 所以像這種不可變的引用類型,雖然傳入的也是對象的引用,但是無論在方法中如何操作,原對象的值是不會發生變化的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM