请问,Student类中的changeAge2()和changeAge3()方法为啥会不一样呢,请高手详细告知其原因?不胜感激代码如下:public class Student{
int age = 20;
public static void changeAge2(Student s) {
Student s2 = new Student();
s2.age = s2.age + 1;
s = s2;
}
public static void changeAge3(Student s) {
s.age = s.age + 1;
} public static void main(String[] args) {
Student s = new Student();
System.out.println("1. " + s.age);// 20
changeAge2(s);
System.out.println("2. " + s.age);// 20
changeAge3(s);
System.out.println("3. " + s.age);// 21
}
}
int age = 20;
public static void changeAge2(Student s) {
Student s2 = new Student();
s2.age = s2.age + 1;
s = s2;
}
public static void changeAge3(Student s) {
s.age = s.age + 1;
} public static void main(String[] args) {
Student s = new Student();
System.out.println("1. " + s.age);// 20
changeAge2(s);
System.out.println("2. " + s.age);// 20
changeAge3(s);
System.out.println("3. " + s.age);// 21
}
}
public class Student{
int age = 20;
public static void changeAge2(Student s) {
Student s2 = new Student(); //new一个新对象,s2里面的age为20
s2.age = s2.age + 1; //s2.age +1
s = s2; //s引用s2,最后改变的是s引用的对象~没有改变s原来引用的对象
}
public static void changeAge3(Student s) {
s.age = s.age + 1; //改变s引用对象的age
} public static void main(String[] args) {
Student s = new Student();
System.out.println("1. " + s.age);// 20
changeAge2(s);
System.out.println("2. " + s.age);// 20
changeAge3(s);
System.out.println("3. " + s.age);// 21
}
}
reference指向对象的含义:reference的内存内容即对象值的内存地址。
当对象作为参数被传送给方法时,传的不是reference本身,而是reference的内存内容,即对象值的内存地址,方法被调用时,复制一份新的reference,指向传入的对象值。如果在方法内改变了对象值,那么方法外的对象也即改变了;如果在方法内将方法参数的reference指向新的对象,方法外的reference仍是指向原来的对象,并没有指向方法内的那个新对象,这时此方法内外参数已经完全失去联系。
public class Student{
int age = 20;
public static void changeAge2(Student s) {
Student s2 = new Student(); //新对象s2
s2.age = s2.age + 1; //s2的age值是21
s = s2; //s是个对象所以,,s=s2表示两个对象地址相同 但s对象的内容没有发生变化
}
public static void changeAge3(Student s) {
s.age = s.age + 1; //s对象的age变量被更改了,+1并赋值自己本身 } public static void main(String[] args) {
Student s = new Student(); //新对象
System.out.println("1. " + s.age);// 20
changeAge2(s); //这个方法只改变了地址
System.out.println("2. " + s.age);// 20
changeAge3(s); //这个方法改变了对象里age的值
System.out.println("3. " + s.age);// 21
}
}