Java方法传参,测试在方法内部改变参数内容是否会影响到原值

时间:2022-12-20 05:08:46

我分了三种类型的参数进行测试

一、基本类型

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

打印结果:

Java方法传参,测试在方法内部改变参数内容是否会影响到原值

这里我用的是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 + '\'' +
'}';
}
}

打印结果:

Java方法传参,测试在方法内部改变参数内容是否会影响到原值

这里我打印了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);
}

打印结果:

Java方法传参,测试在方法内部改变参数内容是否会影响到原值

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