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"); 之后
本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/7400988.html,如需转载请自行联系原作者