当前位置: 代码迷 >> Java相关 >> 传值 传引用问题
  详细解决方案

传值 传引用问题

热度:157   发布时间:2007-11-14 22:12:51.0
传值 传引用问题

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  

----------------解决方案--------------------------------------------------------

i 和 s 都不变;

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

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


----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
Java操纵对象是靠引用的,所有对象变量都是引用,但是Java传递给方法参数都是传递的是值而不是引用
----------------解决方案--------------------------------------------------------
那上面例子里的i 是不是就是个形式参数!斑竹我比较笨  别怪我啊 !我就是想不通为什么形参明明改变了 为什么就没变呢 能不能用个比较形象的例子给我讲下呢 谢谢了
----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
你就这样想 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编辑过]


----------------解决方案--------------------------------------------------------
非常感谢斑竹和大工 现在明白了  受益  太谢谢了
----------------解决方案--------------------------------------------------------
  相关解决方案