A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hmwudizl91zl 中级黑马   /  2013-10-5 21:44  /  1889 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java的参数传递方式就只有一种:值传递。
以前在Java的面试题中,就见过这样一个问题:Java的参数传递是值传递还是引用传递?其实这题是问那些从C++转向Java的程序员的,因为在C++中,有一种叫指针的东西,而在Java的世界中,屏蔽了容易让程序员犯错的指针(其实内部只是封装了指针,很多功能的实现其实还是通过指针的),也因此让问题变得更加简单,在Java参数传递中,只存在值的传递,不存在引用传递。
先来看一个例子:
public class Test {
public static void main(String[] args) {
int i = 1 ;
Test test = new Test() ;
test.change(i) ;
System.out.println(i) ;
}
public void change(int i) {
i += 2 ;
System.out.println(i) ;
}
}
这个程序会依次输出3和1。这是已经说明了Java的参数传递是值传递。
值传递的意思就是说,参数在传递过程中,传递的是参数的一个副本,而不是引用本身。
上面的例子可能不足以说明问题,因为上面的例子传递的是基本类型参数,要是引用类型呢?再看下面的例子:
public class Test {
public static void main(String[] args) {
Apple apple = new Apple() ;
apple.setColor(“red”) ;
apple.setSize(“10″) ;
Test test = new Test() ;
test.change(apple) ;
System.out.println(apple) ;
}
public void change(Apple apple) {
apple.setColor(“green”) ;
apple.setSize(“20″) ;
System.out.println(apple);
}
}
class Apple {
private String color ;
private String size ;
public void setColor(String color) {
this.color = color ;
}
public void setSize(String size) {
this.size = size ;
}
public String getColor() {
return this.color ;
}
public String getSize() {
return this.size ;
}
public String toString() {
return “color = ” + this.color + “, size = ” + this.size ;
}
}
上面这段程序依次输出依次输出: color = green, size = 20 和 color = green, size = 20 。
有人会说,你看change()方法这不明明是改变了之前的apple对象吗?这传递的难道不是引用?这是初学者最难理解的地方。
这传递的还的确是引用,也就是传递的apple对象的内存地址;如果不传递引用的话,难道还传递对象吗?那效率低得都海枯石烂了!
虽然传递的是引用,但是传递的是引用的一个副本!这才是关键。再看下面的例子:
public class Test {
public static void main(String[] args) {
Apple apple = new Apple() ;
apple.setColor(“red”) ;
apple.setSize(“10″) ;
Test test = new Test() ;
test.change(apple) ;
System.out.println(apple) ;
}
public void change(Apple apple) {
Apple apple2 = new Apple() ;
apple2.setColor(“green”) ;
apple2.setSize(“20″) ;
apple = apple2 ;
System.out.println(apple);
}
}
class Apple {
private String color ;
private String size ;
public void setColor(String color) {
this.color = color ;
}
public void setSize(String size) {
this.size = size ;
}
public String getColor() {
return this.color ;
}
public String getSize() {
return this.size ;
}
public String toString() {
return “color = ” + this.color + “, size = ” + this.size ;
}
}
上面的程序依次输出: color = green, size = 20 和 color = red, size = 10 。
看出什么问题了吗?就是无论怎么样都无法改变引用。这充分说明了一个问题,在参数传递过程中,传递的是引用的值,也就是引用的副本。没有任何方法能改变引用本身!这就是Java参数传递方式是值传递的含义。深刻理解Java的参数传递对于排除一些难以发现的bug非常有好处。

评分

参与人数 1黑马币 +5 收起 理由
乔兵 + 5

查看全部评分

3 个回复

倒序浏览
感谢分享!
回复 使用道具 举报
传引用也是传值
回复 使用道具 举报
谢谢楼主的分享!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马