Java是值传递还是引用传递

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"); 之后

 

扩展阅读:

http://www.cnblogs.com/jaylon/p/5721571.html

http://www.cnblogs.com/pcideas/articles/5160689.html

http://www.cnblogs.com/binyue/p/3862276.html

 

posted @ 2017-08-20 18:53  SummerChill  阅读(517)  评论(0编辑  收藏  举报