标签:
——reference Java is Pass by Value and Not Pass by Reference
其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易混淆,特此总结一下
首先这里我们先看下两者的异同:
举例:
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确实是值传递,开辟一个新的存储空间存放形参,并将实参的值传递过来,但是两者指向同一处堆的存储空间,所以造成了上述交换无用,但是改变对象中的数据有用的结果
标签:
原文地址:http://www.cnblogs.com/xltcjylove/p/4498910.html