标题:传值 传引用问题
只看楼主
cindy051185
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-10-12
 问题点数:0 回复次数:8 
传值 传引用问题

package coreJava;

public class ParameterTest {
static void increment(int i){
i++;
}
static void changeStudent(Student s){s=new Student("Mary",20);
}
static void changeName(Student s){s.setName("Larry");
}


public static void main(String[] args) {
int i=2;
System.out.println("before increment()"+i);
increment(i);
System.out.println("after increment()"+i);
Student s=new Student("zhao",18);
System.out.println("before changeName"+s);
changeName(s);
System.out.println("after changeName"+s);
changeStudent(s);
System.out.println("after changeName"+s);
}

}
class Student{
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
谁知道结果 顺便解释下为什么 谢谢了

搜索更多相关主题的帖子: 传值 increment Student void 
2007-11-14 22:12
csight
Rank: 1
等 级:新手上路
威 望:1
帖 子:293
专家分:0
注 册:2006-6-11
得分:0 

i 和 s 都不变;

首先i 是基本数据类型,是传值的,所以不变;
s 是一个引用,也是不会变(HashCode),只是指向的内容会变;

s.setName("Larry"); //会使s指向的Studentt对象中的name指向改变,即name指向新的一个字符串;
s=new Student("Mary",20); //会使s的指向改变(但s本身不变),指向一个新的Student


头可断,发型不可乱;血可流,皮鞋不可不擦油;
2007-11-14 22:29
cindy051185
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-10-12
得分:0 

楼上能具体说下传值传引用吗


2007-11-15 08:54
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
得分:0 

传值就是把基本类型的值传给了形式参数,在方法里面改变的也只是形式参数,实际参数并没有改变;传引用也是拷贝一个对象的引用给形式参数,交换的也只是引用的备份,实际的引用还是没有改变,并没有指向其他对象


I'm here, as always...
2007-11-15 09:41
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
得分:0 
Java操纵对象是靠引用的,所有对象变量都是引用,但是Java传递给方法参数都是传递的是值而不是引用

I'm here, as always...
2007-11-15 10:58
cindy051185
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-10-12
得分:0 
那上面例子里的i 是不是就是个形式参数!斑竹我比较笨  别怪我啊 !我就是想不通为什么形参明明改变了 为什么就没变呢 能不能用个比较形象的例子给我讲下呢 谢谢了

2007-11-15 14:22
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
得分:0 

先说值传递吧:i在内存里面有一个位置,假设传给了一个名叫n的形式参数,那么,内存里面就多了一个n的位置,n的值和i的值一样,所以在方法里面交换的是n,i的值还是没有变,因为没有语句操作了i在内存中的值,操作的是i的拷贝即n的值。
再说引用传递:设s是指向一个对象的引用,传递给了一个名叫m的形式参数,那么,此时内存里面多了一个m的位置,而这个m是指向同一个对象的引用,也就是说该对象有了两个引用指向它,一个是s,一个是m。在方法里面你只是让这个m重新指向了一个新的对象而已,但是s还是指向以前的对象的,所以还是不变。
这样讲能明白吗?呵呵


I'm here, as always...
2007-11-15 14:36
雨夜微醺
Rank: 1
等 级:新手上路
威 望:1
帖 子:147
专家分:0
注 册:2006-9-25
得分:0 
你就这样想 static void increment(int i){
i++;
}

i是一个局部变量 它只在此函数内有用 传给I的值 可以当作给i赋值 操作的一直是i这函数内的变量

再比如int n=1;
int b;
b=n;
b=3;
你认为n也是3吗??

[此贴子已经被作者于2007-11-15 16:37:06编辑过]


我若想到你就有种莫名的开心 我一见到你就有种莫名的悸动
2007-11-15 16:36
cindy051185
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-10-12
得分:0 
非常感谢斑竹和大工 现在明白了  受益  太谢谢了

2007-11-15 20:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-186004-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.349814 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved