Java 为值传递而不是引用传递

时间:2015-05-13 00:23:40   收藏:0   阅读:186

——reference Java is Pass by Value and Not Pass by Reference

其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易混淆,特此总结一下

一、值传递和引用传递

  首先这里我们先看下两者的异同:

二、Java总是值传递而非引用传递

举例:

Balloon.java

 1 package com.journaldev.test;
 2  
 3 public class Balloon {
 4  
 5     private String color;
 6  
 7     public Balloon(){}
 8      
 9     public Balloon(String c){
10         this.color=c;
11     }
12      
13     public String getColor() {
14         return color;
15     }
16  
17     public void setColor(String color) {
18         this.color = color;
19     }
20 }

之后我们做一个简单测试,交换两个对象

Test.java

 1 package com.journaldev.test;
 2  
 3 public class Test {
 4  
 5     public static void main(String[] args) {
 6  
 7         Balloon red = new Balloon("Red"); //memory reference 50
 8         Balloon blue = new Balloon("Blue"); //memory reference 100
 9          
10         swap(red, blue);
11         System.out.println("red color="+red.getColor());
12         System.out.println("blue color="+blue.getColor());
13          
14         foo(blue);
15         System.out.println("blue color="+blue.getColor());
16          
17     }
18  
19     private static void foo(Balloon balloon) { //baloon=100
20         balloon.setColor("Red"); //baloon=100
21         balloon = new Balloon("Green"); //baloon=200
22         balloon.setColor("Blue"); //baloon = 200
23     }
24  
25     //Generic swap method
26     public static void swap(Object o1, Object o2){
27         Object temp = o1;
28         o1=o2;
29         o2=temp;
30     }
31 }

输出如下:

1 red color=Red
2 blue color=Blue
3 blue color=Red

 从上面的代码可以得出:

第一点我们就可以看出Java确实是值传递的,然而第二点又让我们出现疑惑,为何对象的修改会影响到主调函数

这涉及到Java中的数据存储方式,堆栈存储在另一篇博文中提及

【Java心得总结一】Java基本类型和包装类型解析

Java中除了基本类型外,其他类型声明都是在栈中保存一个指向堆中的引用,而对象的数据都是在堆中保存的,如图:

 技术分享

 

所以在函数调用时,如果传递对象,Java确实是值传递,开辟一个新的存储空间存放形参,并将实参的值传递过来,但是两者指向同一处堆的存储空间,所以造成了上述交换无用,但是改变对象中的数据有用的结果

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!