java中所有的参数传递都是值传递,也就是说传递的是值的副本,而不是原件,因此,副本的改变不会影响原件。
1、值传递的类型
(1)基本数据类型参数的传递
传递的是值的副本,副本改变不会影响原件
(2)引用类型参数的传递
传递的是实参的引用的副本,引用类型指的是对象的地址,因此,副本和原参数指向了同一个地址,改变副本指向地址对象的值,原参数的值也就跟着改变了。
public class Student { private String name; private Integer age; public Student(String name, Integer age) { this.name = name; this.age = age; } public void testPara(Student student1){ student1.name="zhang"; } public static void main(String args[]){ Student student=new Student("zhai",12); student.testPara(student); System.out.println(student.name); } }
程序运行产生的结果为zhang,因为,student对象的引用和student1对象的引用指向的是同一个地址,student1将对象的值改变后student对象也发生了改变。
public class Student { private String name; private Integer age; public Student(String name, Integer age) { this.name = name; this.age = age; } public void testPara(Student student1){ student1.name="zhang"; } public void testPara1(Student student2){ student2=new Student("liu",11); } public static void main(String args[]){ Student student=new Student("zhai",12); student.testPara(student); System.out.println(student.name); student.testPara1(student); System.out.println(student.name); } }
zhang
zhang
第一步,student和student1对象的引用指向同一个对象:
student1将name属性进行了修改:
第三步,student2和student对象的引用指向同一个对象:
由于testPara1方法内对student2对象的引用创建了新的对象,因此,student2又指向了这个新创建的对象:
2、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- 是值传递,Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对象的引用是永远不会改变的。
- 值传递,如果形参的值发生改变,但是实参的值是不会改变的,因为形参只是实参的一个拷贝
public class Alpha { public static void change(int a,int b){ int temp; temp=a; a=b; b=temp; } public static void main(String[] args) { int num1=1,num2=9; change(num1,num2); System.out.println(num1+" "+num2); } }
- 引用传递:在内存中没有产生实参的副本,直接对实参进行操作。数据量较大时可以节省空间。
不能理解为参数是什么类型就是什么传递