java中有无引用传递

程序员一灯 2012-10-15 11:11:49
讨论下,java中有无引用传递,
为什么很多人说java中没有引用传递呢?
...全文
7811 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
infinite2009 2014-12-09
  • 打赏
  • 举报
回复
引用 12 楼 yjbren 的回复:
public static void swap(String a, String b) { String c = a; a = b; b = c; } 这是我写的swap,略菜,照此方法测试后输出的是A B,没有输出你说的B A [Quote=引用 3 楼 的回复:] 我个人理解翻来覆去就两句话: 1、Java函数调用时,参数传递方式为值传递; 2、当该参数类型为对象(Object)时,则所传递的值为对象的引用(也可理解为地址)。 如果你认为Java函数调用有指针传递或引用传递的话,你可以尝试编写这样一个函数来验证: public void swap(Object a, Object b); 效果就是调用后,主调函数的这两个对象互换即可。…… [/Quote]
这种写法得到的string是个值,传入它给的也是拷贝,除非你使用new String(String s)
  • 打赏
  • 举报
回复
java传参一律为值传递 如果传入引用类型的对象 那么对象被引用传递 对象的引用本身还是值传递 基元类型可以通过装箱操作进行引用传递

这好比c中的指针传递 指针指向的值被引用传递 但是指针本身是值传递的
tzz8080 2013-10-10
  • 打赏
  • 举报
回复
太多的人说,java没有引用传递。。。,我都有点沉不住了。像int 这样的值类型传给某一个函数时,它就是值传递,如果传的是一个类new出来的对象,它就是一个引用。 在c++下,传值和传引用区别很大的,如果传的是一个对象,那么它就会存在这个对象的内存拷贝操作,如果传的是这个对象的引用,那么就只传它的地址,传地址的效率是要快很多。 在java下,比如有一个类A ,它有一个变量 A a = new A();在把变量a传给一个函数时,传的一直是引用的方式,那么在函数内对a成员变量的值进行修改,a的值就改变了;有些人说java没有引用传递,真让人不解. 以下用代码说明: class A { public int v = 10; } void main() { A b = new A(); //一个A对象 fun1(b); //调用函数,传入变量b,在函数内,b的成员值被改。 int d = b.v; //在这里,b.v值已经被改,所以对于对象变量,传的都是引用,其实就是一 //地址,在这里,我认为不要在概念上去扣文字,重要的是理解它的思想。 } void fun1(A a) { a.v = 111; //修改a的值 }
z_yes163 2012-12-10
  • 打赏
  • 举报
回复
真的 学习了。
xuan.ye 2012-10-30
  • 打赏
  • 举报
回复
java 传引用


public static void main(String[] args) {
AtomicReference<Object> msg = new AtomicReference<Object>("Hello World");

Display(msg);

System.out.println(msg.get());

}

public static boolean Display(AtomicReference<Object> msg) {

msg.set("error");
return false;
}

hbwhwang 2012-10-22
  • 打赏
  • 举报
回复
这是一个例子,可以很好地理解上面我所说的。

public class JavaParameterTest {
public static void main(String[] args) {
int i=1;
System.out.println("before call:i="+i+"\n");
primitiveParam(i);
System.out.println("after call:i="+i+"\n");
String s="test";
System.out.println("before call:s="+s+"\n");
WrapParam(s);
System.out.println("after call:s="+s+"\n");
StringBuilder sb=new StringBuilder("test");
System.out.println("before call:sb="+sb+"\n");
ObjectParam(sb);
System.out.println("after call:sb="+sb+"\n");
}

public static void WrapParam(String s){
s=s+"123";
}

public static void ObjectParam(StringBuilder s){
s.append("123");
}

public static void primitiveParam(int i){
i+=1;
}

}
hbwhwang 2012-10-22
  • 打赏
  • 举报
回复
java传递参数根据参数的数据类型,有2种模式:
(1)如果是原始数据类型,如:int,char...,那么传递的是值。
(2)如果是类,如:String,StringBuilder...,那么传递的是对象的引用,即地址
第(1)种模式很好理解
第(2)种模式要这样理解,因为把对象的引用(地址)传递过来了,所以在被调用者里面可以对这个对象进行操作,比如修改里面的成员值,但是对这个引用参数本身的修改无用(重新赋值只是相当于把原来的对象地址丢弃)。

需要注意的是第(2)种模式中,如果传递的对象是以不变模式(Immutabel)设计的类,如String,Integer等,那么你是没办法修改其成员值的,这种情况就跟第(1)种模式一样了。
MiceRice 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 的回复:]
三楼傻 逼了,这样可以交换a,b 吗?真不知道你是怎么混到5星的
[/Quote]

骂人之前,稍微花点时间看看对方在说什么吧。。。

另外,星星也数错了。
一起来玩玩呗 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

我个人理解翻来覆去就两句话:
1、Java函数调用时,参数传递方式为值传递;
2、当该参数类型为对象(Object)时,则所传递的值为对象的引用(也可理解为地址)。


如果你认为Java函数调用有指针传递或引用传递的话,你可以尝试编写这样一个函数来验证:
public void swap(Object a, Object b);
效果就是调用后,主调函数的这两个对象互换即可。……
[/Quote]
三楼傻 逼了,这样可以交换a,b 吗?真不知道你是怎么混到5星的
一起来玩玩呗 2012-10-21
  • 打赏
  • 举报
回复
JAVA 中不存在所谓的“引用传递”,在JVM 中传递对象时,都是传递对象值的一份拷贝,
具体的解释可以看我的博客:http://blog.csdn.net/q745401990/article/details/8081766
程序员一灯 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 的回复:]

引用 55 楼 的回复:
三楼傻 逼了,这样可以交换a,b 吗?真不知道你是怎么混到5星的


骂人之前,稍微花点时间看看对方在说什么吧。。。

另外,星星也数错了。
[/Quote]

哈哈哈。。。。
我正在看大家的回复。。。
谢谢大家的回答。。。
creso 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 的回复:]

引用 46 楼 的回复:

学过OC~对于引用传递和值传递的概念又更深刻了
JAVA里的所谓引用传递类似OC里的
a = [b copy];
C代码可以这么理解
int i=1;
int *a = &amp;i;
int j = i;
int *b = &amp;j;
相当于new了一个新对象后把新对象(i)的地址赋值给a,新对象(j)的值与b指向对象的值一……
[/Quote]
参数传递不就是赋值吗。。要不参数值从哪来?
依琳小师妹 2012-10-20
  • 打赏
  • 举报
回复
这个问题很难说清楚,总之Java中的引用和C++是不同的。
jsp_style 2012-10-20
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

你就这样理解:
值传递就是值的拷贝
引用传递就是引用的拷贝
比如
public class Demo{
public void testInt(int i){
++i;
}
public void testStrintBuilder(StringBuilder sb){
sb.append("123");
}
public static void main(String……
[
/Q


就是说 基本类型 传值 值不会改变 引用类型 传值 会改变。。小弟 新手刚学j。理解不是很透彻
uote]
胸口碎大石_ 2012-10-20
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 的回复:]

引用 47 楼 的回复:

java 中确实有引用传递,不过需要包

可以给出包名和下载地址吗?
[/Quote]

大哥你是学C#的吧 ref
Alexander 2012-10-20
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 的回复:]

java 中确实有引用传递,不过需要包
[/Quote]
可以给出包名和下载地址吗?
Alexander 2012-10-20
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 的回复:]

学过OC~对于引用传递和值传递的概念又更深刻了
JAVA里的所谓引用传递类似OC里的
a = [b copy];
C代码可以这么理解
int i=1;
int *a = &i;
int j = i;
int *b = &j;
相当于new了一个新对象后把新对象(i)的地址赋值给a,新对象(j)的值与b指向对象的值一致。
所以修改a指向地址的值(i)不会影响到b指……
[/Quote]
感觉LS这位没理解什么是引用传递。

话说a = [b copy],a = [b retain]根本不是参数传递的问题,而是赋值的问题吧。
xietianhua126 2012-10-19
  • 打赏
  • 举报
回复
java中不存在引用传递,如果是引用对象的话,则传递的是地址值,基本类型则是值传递
gaojava 2012-10-19
  • 打赏
  • 举报
回复
java 只有值传递
xuan.ye 2012-10-19
  • 打赏
  • 举报
回复
java 中确实有引用传递,不过需要包
加载更多回复(43)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧