java参数到底是值传递还是址传递,求指教

a34020249 2011-07-13 05:02:02
求指教

public class Test {
int i = 1;
Dog d;

Test(){}
Test(int i) {
this.i = i;
}
Test(int i, String name) {
this.i = i;
this.d = new Dog(name);
}

public static void main(String[] args) {
Test t = new Test();
System.out.print(t.i + "\t");
setTest(t);
System.out.print(t.i + "\t");
setTest(t, 5);
System.out.print(t.i + "\n");
t = new Test(2, "ahuang");
System.out.println(t.d);
setDog(t.d);
System.out.println(t.d);
setDog(t);
System.out.println(t.d);
}

public static void setTest(Test t) {
t = new Test(3);
}

public static void setTest(Test t, int i) {
t.i = i;
}

public static void setDog(Dog d) {
d = new Dog("heizi");
}

public static void setDog(Test t) {
t.d = new Dog("heizi");
}
}

class Dog {
int id;
static int count = 0;
String name;

Dog(String name) {
id = count++;
this.name = name;
}

public String toString() {
return this.id + "\t" + this.name;
}
}

/*
* outPut:~
* 1 1 5
* 0 ahuang
* 0 ahuang
* 2 heizi
*/
...全文
117 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
a34020249 2011-07-13
  • 打赏
  • 举报
回复
噢,我突然明白了,谢谢12楼的解释,setTest(t)这个方法里改变的是t的引用,但是实际的t还在那里。

setDog(t.d)中也是一样改变的是d的引用,谢谢12楼了。
a34020249 2011-07-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pipi517 的回复:]

Test t = new Test();
System.out.print(t.i + "\t");
setTest(t);// t 是引用传递可以改变对象的属性,但是引用本身并不会改变。
System.out.print(t.i + "\t");// = 1
setTest(t, 5);// t 的属性i 改变
……
[/Quote]

setTest(t);// t 是引用传递可以改变对象的属性,但是引用本身并不会改变。

setDog(t.d);//setDog中 d = new Dog("heizi"); d 引用改变了。t.d的值没变。==0 ahuang

这两句我没懂,在setTest(Test t)中我不是改变了t = new Test(3)了吗?
还有 public static void setDog(Dog d)中我也改变了d啊,d变成了新new出来的一只叫heizi的狗狗了噢,但是为什么却没变呢?
皮皮 2011-07-13
  • 打赏
  • 举报
回复
Test t = new Test();
System.out.print(t.i + "\t");
setTest(t);// t 是引用传递可以改变对象的属性,但是引用本身并不会改变。
System.out.print(t.i + "\t");// = 1
setTest(t, 5);// t 的属性i 改变
System.out.print(t.i + "\n");//=5
t = new Test(2, "ahuang");
System.out.println(t.d);// Dog的id无值.=0
setDog(t.d);//setDog中 d = new Dog("heizi"); d 引用改变了。t.d的值没变。==0 ahuang
System.out.println(t.d);
setDog(t);//setDog(Test t)中修改的t 引用的属性 == heizi 为什么==2 heizi 是因为你前边setDog(Dog d) 的时候。count =1 了,所以现在是2
System.out.println(t.d);
a34020249 2011-07-13
  • 打赏
  • 举报
回复
我希望有人可以认真看我我贴出的代码,我想知道为什么
setTest(t)后不变t的值不变;
setTest(t, 5)后变了;
setDog(t.d)后不变;
setDog(t)后变了。
a34020249 2011-07-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leisure55 的回复:]

所以如果传递是基本类型,不会影响原来的值;
传递引用类型,则会改变引用指向的值..
[/Quote]

但是事实和和你说的有一定区别,看看setTest(t);这个方法的,我之前也是你那么想的。
leisure55 2011-07-13
  • 打赏
  • 举报
回复
Test是属于引用类型了。
对象的引用指向一块内存区域,该区域是该对象的实际数据.
你要把java里面的对象存储模型。。。搞清楚才行。
leisure55 2011-07-13
  • 打赏
  • 举报
回复
所以如果传递是基本类型,不会影响原来的值;
传递引用类型,则会改变引用指向的值..
a34020249 2011-07-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 leisure55 的回复:]

java里面都是值传递。
不管是基本类型还是引用类型,都会传递其值或引用的副本到函数中去。
详情可以参考 《core java》第一卷的讲解
[/Quote]

可以看看我贴出来的代码吗,看看比如说这个方法setDog(t);为什么我在方法中改变了参数的值,可是实际的值也变了。
a34020249 2011-07-13
  • 打赏
  • 举报
回复
我想问的是当在一个方法中改变参数的时候,会不会影响到方法外面被传递的那个参数。我知道表达的不怎么清楚,反正大体就是那意思啦。。
leisure55 2011-07-13
  • 打赏
  • 举报
回复
java里面都是值传递。
不管是基本类型还是引用类型,都会传递其值或引用的副本到函数中去。
详情可以参考 《core java》第一卷的讲解
a34020249 2011-07-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 licip 的回复:]

基本数据类型是值的备份传递,又叫值传递。
引用数据类型是引用传递,传的是引用数据类型的地址指向的值。
严格的来说,都是值传递。只是一个是传地址的指向值。
[/Quote]
可以看看我贴出的代码帮我解释下吗?
坦诚 2011-07-13
  • 打赏
  • 举报
回复
分为 值传递 和 按引用传递吧? 按引用传递 前面加个 ref
licip 2011-07-13
  • 打赏
  • 举报
回复
基本数据类型是值的备份传递,又叫值传递。
引用数据类型是引用传递,传的是引用数据类型的地址指向的值。
严格的来说,都是值传递。只是一个是传地址的指向值。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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