关于参数传递的最基础问题,100分送上!

Featured 2011-02-22 08:01:04
package PassRef;

public class PassRef {
int x;
public static void main (String []args)
{
PassRef obj= new PassRef();
obj.x=5;
change(obj);
System.out.println(obj.x);

int x;
x=5;
change1(x);
System.out.println( x);


}

public static void change(PassRef obj)
{
obj.x=3;
}
public static void change1(int i)
{
i=3;
}


}

执行结果是:
3
5

说明,对象是引用传递,而普通变量是值传递。为什么
...全文
299 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
Awing911 2011-02-25
  • 打赏
  • 举报
回复
基本数据类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的。
引用数据类型(对象)作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数,改变其值,原对象的值也会被改变。
woshimike 2011-02-24
  • 打赏
  • 举报
回复
我忘记了 地址也是保存在 栈里面的一个变量里面了
woshimike 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 woshimike 的回复:]
public class Test {


public static void main(String[] args) {


String str2 = new String("sss");
change1(str2);
System.out.println(str2);

}

public static void change1(String s){

s = ……
[/Quote]

受教
Joop_Song 2011-02-24
  • 打赏
  • 举报
回复
change1()无返回值,传入的参数是int类型的一个拷贝
dracularking 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 woshimike 的回复:]

public class Test {


public static void main(String[] args) {


String str2 = new String("sss");
change1(str2);
System.out.println(str2);

}

public static void change1(String s){

s =……
[/Quote]
算地址,只是s把旧地址抛弃换了新地址
str2和s是两个变量,在s没改变引用之前,它们的引用是相同的(这里改变的不是引用所指对象的内容)
woshimike 2011-02-24
  • 打赏
  • 举报
回复
public class Test {


public static void main(String[] args) {


String str2 = new String("sss");
change1(str2);
System.out.println(str2);

}

public static void change1(String s){

s = "ddd";
}
}


如果对象是传的是地址 为什么这个的结果是: sss
dracularking 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 featured 的回复:]

楼上朋友的这个比喻。。。嗯,你尽力了!!

呵呵,我上面说了,我现在只有这个疑问:

这两者的差异根源,是不是就在于一个是new的,在堆里;一个是普通变量, 在栈里?
[/Quote]
都是传值,分什么堆里栈里
okjohn 2011-02-24
  • 打赏
  • 举报
回复
上面写错了:

obj1 -> A对象,如果 obj2=obj1,则obj2 -> A对象
不管通过obj1还是obj2修改了A对象,然后再通过obj1或obj2访问A对象时都是被修改后的A对象。
okjohn 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 featured 的回复:]
楼上朋友的这个比喻。。。嗯,你尽力了!!

呵呵,我上面说了,我现在只有这个疑问:

这两者的差异根源,是不是就在于一个是new的,在堆里;一个是普通变量, 在栈里?
[/Quote]
可以简单的这么理解,实际上原理是这样的:

PassRef obj= new PassRef();//在栈里创建一个变量obj,其值为堆里刚创建的PassRef对象的地址
int x=5; // 在栈里创建一个变量x,其值为5
change(obj);// 值传递, change方法输入参数被赋值为obj的值(PassRef对象的地址)
change(x);// 值传递, change方法输入参数被赋值为x的值(5)

我觉得,主要根源不是由于参数传递方式引起,而是由于使用对象时采取了类似“引用”的方式:
obj1 -> A对象,如果 obj2=obj2,则obj2 -> A对象
不管通过obj1还是obj2修改了A对象,然后再通过obj1或obj2访问A对象时都是被修改后的A对象。


sevendawn 2011-02-24
  • 打赏
  • 举报
回复
java都是指传递的,哪来的引用传递
基本类型的是把自己的值给传递过去,本身并不改变的
而对象的话,分为普通对象和String对象
普通对象的话,也是值传递,不过传递的是这个对象所在的内存地址,所以如果在方法体内把这个内存地址上的数据给改变了,原来的也会变
而String对象,虽然是值传递,但真正在方法体内起作用的是拷贝的值,所以原来的值并不改变
whmjxa 2011-02-23
  • 打赏
  • 举报
回复
刚才写快了,最后写错了
调用方法的时候,change(t);实际上是
s=t; s="123";
改变的是s,而不是t
whmjxa 2011-02-23
  • 打赏
  • 举报
回复
java都是指传递的,哪来的引用传递
基本类型的是把自己的值给传递过去,本身并不改变的
而对象的话,分为普通对象和String对象
普通对象的话,也是值传递,不过传递的是这个对象所在的内存地址,所以如果在方法体内把这个内存地址上的数据给改变了,原来的也会变
而String对象,虽然是值传递,但真正在方法体内起作用的是拷贝的值,所以原来的值并不改变
比如

void change(String s){
s = "123";
}
调用方法的时候,change(t);实际上是t=s; t="123";
dracularking 2011-02-23
  • 打赏
  • 举报
回复
上面有说的很好的,java都是传值,传值其实就是拷贝
而传引用的话定义就是 形参实际上是实参的alias
zn85600301 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 touchspirit 的回复:]

java使用的都是值传递。方法使用的都是对传入值的拷贝;
分基本数据类型和对象类型:对象类型是copy了那个引用的值,但指向任然是一个对象。
[/Quote]
楼主好好理解下 做些练习就明白了
zm_hs 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 salever 的回复:]

其实java就是传值,非要分传值传引用是没有什么意义的

public static void change(PassRef obj)你这个方法,传递进去的obj其实也是一个值,无非这个值是一个内存地址而已,地址指向一块内存区域,而这个地址是不会变的。obj.x=3;这一行代码修改的不是地址本身,而是地址指向的区域。

public static void change1(int i)这……
[/Quote]

顶!!
YOULOVEXIA 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 salever 的回复:]
其实java就是传值,非要分传值传引用是没有什么意义的

public static void change(PassRef obj)你这个方法,传递进去的obj其实也是一个值,无非这个值是一个内存地址而已,地址指向一块内存区域,而这个地址是不会变的。obj.x=3;这一行代码修改的不是地址本身,而是地址指向的区域。

public static void change1(int i)这个……
[/Quote]

ding.....
touchspirit 2011-02-23
  • 打赏
  • 举报
回复
java使用的都是值传递。方法使用的都是对传入值的拷贝;
分基本数据类型和对象类型:对象类型是copy了那个引用的值,但指向任然是一个对象。
keeya0416 2011-02-23
  • 打赏
  • 举报
回复
对象传过去的是对象在堆中的地址,那么在别的地方是可以通过这个地址改变其内部的对象的属性值的
i李小武 2011-02-23
  • 打赏
  • 举报
回复
基本类型传值,对象类型传引用.
Featured 2011-02-23
  • 打赏
  • 举报
回复
楼上朋友的这个比喻。。。嗯,你尽力了!!

呵呵,我上面说了,我现在只有这个疑问:

这两者的差异根源,是不是就在于一个是new的,在堆里;一个是普通变量, 在栈里?
加载更多回复(14)

62,615

社区成员

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

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