面试题:Java中值传递和引用传递的问题

随便写写留着自己看。

首先,Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!

当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。

下面几个例子帮助理解。

例1:

先看一段代码:

 1 public class Test2 {
 2     String str = new String("good");
 3     String str1 = "wtf";
 4     int a = 10;
 5     char[] ch = { 'a', 'b', 'c' };
 6 
 7     public static void main(String[] args) {
 8         Test2 test2 = new Test2();
 9         test2.change(test2.str, test2.str1, test2.ch, test2.a);
10         System.out.println(test2.str);
11         System.out.println(test2.str1);
12         System.out.println(test2.a);
13         System.out.println(test2.ch);
14     }
15 
16     public void change(String str, String str1, char[] ch, int a) {
17         str = new String("change ok");
18         str1 = "change ok";
19         ch[0] = 'g';
20         a = 13;
21     }
22 }
1 good
2 wtf
3 10
4 gbc
输出结果

分析:

可以看到String,int的值没有变,char[]数组中的值变了。为什么呢,简单画几个图来说明。

一、String

String是不可变类型,传递的是“good”在堆中的地址。

二、int

对于基本数据类型,传递的是值的一份拷贝,这份拷贝与原来的值没什么关系。

这个例子中,类变量a的值是10,没有改变,change方法中a的值由一开始的10变成了13。

三、char[]

类似于String中的before情况,不画了,传递的是堆中数组的引用(地址)。

指向的是同一个数组,所以ch[0]的值被改变了。


例2: 

 1 public class Test5 {
 2 
 3     public static void main(String[] args) {
 4         // TODO Auto-generated method stub
 5         int[] arr1 = { 1, 2, 3, 4, 5 };
 6         int[] arr2 = arr1;
 7         arr2[1] = 16;
 8         System.out.println("arr1=" + Arrays.toString(arr1));
 9         System.out.println("arr2=" + Arrays.toString(arr2));
10     }
11 }
arr1=[1, 16, 3, 4, 5]
arr2=[1, 16, 3, 4, 5]
输出结果

同样arr1和arr2指向的是同一个数组,所以改变一个的值另一个的值也就变了。

如果想将数组复制一份,那么应该声明、创建并初始化一个新的数组,然后将原数组中的元素挨个复制到新数组。

原文地址:https://www.cnblogs.com/kkkky/p/7772517.html