1.Java到底是值传递还是引用传递?
首先找到一个面试题及答案:
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
上实例代码:
1 public class ReferencePkValue {
2 public static void main(String[] args) {
3 int num = 1;
4 foo(num); // num 没有被改变
5
6 String str = "ABC";
7 foo(str); // str 也没有被改变
8
9 StringBuilder sb1 = new StringBuilder("iphone");
10 foo1(sb1); // sb 被改变了,变成了"iphone4"。
11
12 StringBuilder sb2 = new StringBuilder("iphone");
13 foo2(sb2); // sb 没有被改变,还是 "iphone"
14
15
16 System.out.println("num:" + num);//num:1
17 System.out.println("str:" + str);//str:ABC
18 System.out.println("sb1:" + sb1.toString());//sb1:iphone4
19 System.out.println("sb2:" + sb2.toString());//sb2:iphone
20 }
21 //第一个例子:基本类型
22 static void foo(int value) {
23 value = 100;
24 }
25
26 //第二个例子:没有提供改变自身方法的引用类型
27 static void foo(String text) {
28 text = "windows";
29 }
30
31 //第三个例子:提供了改变自身方法的引用类型
32 static void foo1(StringBuilder builder) {
33 builder.append("4");
34 }
35
36 //第四个例子:提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符。
37 static void foo2(StringBuilder builder) {
38 builder = new StringBuilder("ipad");
39 }
40
41 }
示例三图例;
builder.append("4")之后
示例四图解:
builder = new StringBuilder("ipad"); 之后
本博客为自己总结亦或在网上发现的技术博文的转载。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |