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);
    }

打印结果:

 

 所以像这种不可变的引用类型,虽然传入的也是对象的引用,但是无论在方法中如何操作,原对象的值是不会发生变化的

 

posted @ 2020-08-12 15:19  你像六月微风  阅读(1798)  评论(0编辑  收藏  举报