请问,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
}
}

解决方案 »

  1.   


    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
        }
    }
      

  2.   

    一个对象包含四个方面:reference的内存地址、reference的内存内容、对象值的内存地址、对象值的内存内容。 
    reference指向对象的含义:reference的内存内容即对象值的内存地址。 
    当对象作为参数被传送给方法时,传的不是reference本身,而是reference的内存内容,即对象值的内存地址,方法被调用时,复制一份新的reference,指向传入的对象值。如果在方法内改变了对象值,那么方法外的对象也即改变了;如果在方法内将方法参数的reference指向新的对象,方法外的reference仍是指向原来的对象,并没有指向方法内的那个新对象,这时此方法内外参数已经完全失去联系
      

  3.   


    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
        }
    }