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;
}
}
谁知道结果 顺便解释下为什么 谢谢了
----------------解决方案--------------------------------------------------------
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编辑过]
----------------解决方案--------------------------------------------------------
非常感谢斑竹和大工 现在明白了 受益 太谢谢了
----------------解决方案--------------------------------------------------------