前提
本案例基于JDK1.8
结论
基本数据类型作为方法参数传递是值传递,改变参数值不会影响到原始值
引用数据类型,比如普通对象、对象/基本数据类型列表、对象/基本数据类型数组等作为参数传递,通过参数改变其内容,原始引用内容也会被修改,是地址(引用)传递。
案例代码
public static void main(String[] args) {
int num = 0;
System.out.println("基本数据类型===开始");
System.out.println("基本数据类型-int修改前:" + num);
modifyBasicType(num);
System.out.println("基本数据类型-int修改后:" + num);
System.out.println("基本数据类型===结束");
System.out.println();
System.out.println("引用数据类型===开始");
Parent parent = new Parent();
System.out.println("引用数据类型-对象-修改前:" + parent.getNum());
modifyTyRefObjectType(parent);
System.out.println("引用数据类型-对象-修改后:" + parent.getNum());
System.out.println();
int[] ints =new int[1];
System.out.println("基本数据类型-int数组-修改前:" + ints[0]);
modifyBasicArrayType(ints);
System.out.println("基本数据类型-int数组-修改后:" + ints[0]);
System.out.println();
Parent[] parents = new Parent[1];
parents[0]=new Parent();
System.out.println("引用数据类型-数组中对象-修改前:" + parents[0].getNum());
modifyTyRefArrayType(parents);
System.out.println("引用数据类型-数组中对象-修改后:" + parents[0].getNum());
System.out.println();
List<Parent> list = new ArrayList<>();
list.add(new Parent());
System.out.println("引用数据类型-列表中对象-修改前:" + list.get(0).getNum());
modifyTyRefListType(list);
System.out.println("引用数据类型-列表中对象-修改后:" + list.get(0).getNum());
System.out.println();
list.get(0).child = new Parent.Child();
System.out.println("引用数据类型-列表中对象子对象-修改前:" + list.get(0).getChild().getChildNum());
modifyTyRefListType2(list);
System.out.println("引用数据类型-列表中对象子对象-修改后:" + list.get(0).getChild().getChildNum());
System.out.println("引用数据类型===结束");
}
private static void modifyBasicType(int num) {
num = 9;
}
private static void modifyBasicArrayType(int[] array) {
array[0] = 10;
}
private static void modifyTyRefObjectType(Parent parent) {
parent.setNum(10);
}
private static void modifyTyRefArrayType(Parent[] array) {
Parent test = array[0];
test.setNum(10);
}
private static void modifyTyRefListType(List<Parent> list) {
Parent test = list.get(0);
test.setNum(10);
}
private static void modifyTyRefListType2(List<Parent> list) {
Parent parent = list.get(0);
Parent.Child child = parent.getChild();
child.setChildNum(10);
}
public static class Parent {
int num;
Child child;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public Child getChild() {
return child;
}
public void setChild(Child child) {
this.child = child;
}
public static class Child {
int childNum;
public void setChildNum(int childNum) {
this.childNum = childNum;
}
public int getChildNum() {
return childNum;
}
}
}
输出结果
基本数据类型===开始
基本数据类型-int修改前:0
基本数据类型-int修改后:0
基本数据类型===结束
引用数据类型===开始
引用数据类型-对象-修改前:0
引用数据类型-对象-修改后:10
基本数据类型-int数组-修改前:0
基本数据类型-int数组-修改后:10
引用数据类型-数组中对象-修改前:0
引用数据类型-数组中对象-修改后:10
引用数据类型-列表中对象-修改前:0
引用数据类型-列表中对象-修改后:10
引用数据类型-列表中对象子对象-修改前:0
引用数据类型-列表中对象子对象-修改后:10
引用数据类型===结束
本文探讨了Java中参数传递的区别,对于基本数据类型,传递的是值,不会影响原始值;而对于引用数据类型,如对象、数组等,传递的是引用,改变参数将影响原始内容。
1268

被折叠的 条评论
为什么被折叠?



