当对象被作为一个参数被一个方法调用时,这里到底是值传递还是引用传递?
答:在JAVA程序语言中,只有值传递参数。而且在方法外这个值都是不受方法影响的。
无论是基本类型作为参数传递,还是对象作为参数传递,实际上传递的都是值,只是值的的形式不用而已。
基本数据类型作为参数传递,传递的是值的副本
引用数据类型作为参数传递,传递的是引用的副本 (引用中放的是对象的地址,在方法进行完毕后,地址还是不变的,只是地址对应的对象可能发生了改变)
Student s=new Student();
在栈中为s开辟空间,存放Student的地址
当被方法 public void change(Student s){ }调用时
在栈中为s开辟空间(这里的s为区间变量,不等于上面的s,这里的s可以是随便取名,a,b等,只代表方法传入参数的一个对象),当方法执行完毕后,系统会清理方法所开辟的栈的空间。
当参数的是基本数据类型时,传入的是值得拷贝,不管方法内部怎么改变,方法外的值是不变的。
- //在函数中传递基本数据类型,
- public class Test {
- public static void change(int i, int j) {
- int temp = i;
- i = j;
- j = temp;
- }
- public static void main(String[] args) {
- int a = 3;
- int b = 4;
- change(a, b);
- System.out.println("a=" + a);
- System.out.println("b=" + b);
- }
- }
- 结果为:
- a=3
- b=4
- 原因就是 参数中传递的是 基本类型 a 和 b 的拷贝,在函数中交换的也是那份拷贝的值 而不是数据本身;
当参数的是引用数据类型时,传入的是地址得拷贝,当方法对这个地址进行操作时,也会对地址对应的对象进行修改,所以方法外的引用数据类型也会发生改变。
- //传的是引用数据类型
- public class Test {
- public static void change(int[] counts) {
- counts[0] = 6;
- System.out.println(counts[0]);
- }
- public static void main(String[] args) {
- int[] count = { 1, 2, 3, 4, 5 };
- change(count);
- }
- }
- 在方法中 传递引用数据类型int数组,实际上传递的是其引用count的拷贝,他们都指向数组对象,在方法中可以改变数组对象的内容。即:对复制的引用所调用的方法更改的是同一个对象。
- //对象的引用(不是引用的副本)是永远不会改变的
- class A {
- int i = 0;
- }
- public class Test {
- public static void add(A a) {
- a = new A();
- a.i++;
- }
- public static void main(String args[]) {
- A a = new A();
- add(a);
- System.out.println(a.i);
- }
- }
- 输出结果是0
- 在该程序中,对象的引用指向的是A ,而在change方法中,传递的引用的一份副本则指向了一个新的OBJECT,并对其进行操作。
- 而原来的A对象并没有发生任何变化。 引用指向的是还是原来的A对象。
String为引用类型,但有final修饰,所以在传值时可看做是基本数据类型。