class Person{
int age = 15;
public static void changeAge(Person p){
p.age = 10;
Person p1 = new Person();
p = p1;
System.out.println(p.age);
}
public static void main(String [] args){
Person p = new Person();
changeAge(p);
System.out.println(p.age);
}
}为什么打印的是15 10了?
个人认为是15 15 啊

解决方案 »

  1.   

    设个断点单步跟踪执行你就明白了
      
      changeAge(p);
    传入的这个p只是传了一个引用,这个p和
    p.age = 10;
    这个时候的p实际上是两个引用,在changeAge方法内部的p无论怎么改变也不会影响到主程序中的p
      

  2.   

    但是已经影响到了主程序中的P了啊
    不是打印的P.age = 10吗  不是changeAge中改变的妈?
      

  3.   


    只传地址的COPY,即引用的COPY,ChangeAge方法里面对P的重新指向,并不影响原来main方法里的p对象的指向。
      

  4.   

    额。。
    对不起。我说错了,是这样的
    主程序中的p和changeAge方法里面的p由于指向同一个对象,那么你改变p指向对象的地址的值的话,那么另一个肯定会跟着变。
    但你将changeAge方法里面的p重新指向另一个对象(即p1指向的对象),则不会影响到主程序中的p,所以主程序中的p还是指向原来那个对象,即age被改变的那个对象可以这样理解,有两个Person,
    执行前
    p(主程序),p(changeAge中的)指向Person1,p1指向Person2   同时Person1和Person2的age都是15
    执行后
    p(主程序)指向Person1,而且Person1中的age变成了10,而p(changeAge中的)和p1都指向Person2
      

  5.   

    class Person{
        int age = 15;
        public static void changeAge(Person p){
    //        p.age = 10;
            Person p1 = new Person();
            p = p1;
            System.out.println(p.age);
        }
        public static void main(String [] args){
            Person p = null;
            changeAge(p);
            System.out.println(p.age);
        }
    }运行这个代码就明白了
      

  6.   

    java值传递 
    changeAge(p);//并没有改变
      

  7.   

    changeAge方法并没有改变this.age只是改变了传入的参数
      

  8.   

    同意四楼的说法可以这样说,JAVA调用函数时changeAge只是复制了一份指向Person对象的引用,这时两份引用(参数和主函数里的)指向了同一个对象,所以,p.age=10会修改对象的内容,而p=p1则将函数ChangeAge中的从主函数复制而来的引用指向了另一个对象的引用,所以,下面一句输出的是15,而结束函数调用后,主函数中的对象并没结束生命周期,所以其属性在函数changeAge中的改变(p.age=10)有效性还是存在的,所以输出的是10,LZ明白了没呢?
      

  9.   

    画个内存图你就明白了。
    执行changeage(p);时,在栈中产生一个变量p指向对象p,注意这两个p不是一回事,一个是局部变量一个是对象的引用,然后通过p.age=10;将对象中age的值改变为10,再将p=pl;就是说变量p不再指向对象p,而指向对象pl了,但对象p中的age的值仍然是10,所以方法中打印p.age输出的是新new出的对象pl的值,不管你前面如何改变,最后输出的都是15,因为pl.age的值没有被改变过!
    执行打印main方法中的p.age时,自然就是输出对象p中的age的值了,age的值在方法中已被改变为10。搞清楚内存的分配很重要!你认为输出的值是15,是因为你把p=pl;看成是把对象pl赋给对象p了,其实这个p只不过是一个局部变量而已,当方法执行完以后,这个p也随之消失了。
      

  10.   

    class Person{
        int age = 15;
        public static void changeAge(Person a){ //改一下看得明白点
            a.age = 10;
            Person p1 = new Person();
            a = p1;
            System.out.println(a.age);//输出的是p1.age的值 
        }
        public static void main(String [] args){
            Person p = new Person();
            changeAge(p);
            System.out.println(p.age);//输出的是被a.age改变后的值
        }
    }
      

  11.   

    函数调用传的是对象引用的拷贝,也即拷贝了对象的地址
    Person p1 = new Person();//生成了新的地址
    p = p1;//p的地址改变
    所以就产生上面的打印信息
      

  12.   

    p.age = 10;把主程序的P改到了10;这里的 p 和 主程序的 p 不是同一个引用,只是它们指向同一个地址;
    之后的
             Person p1 = new Person();
            p = p1;
            System.out.println(p.age);
    把方法里的 p 指向了一个新的地址 所以 p.age = 15;
    而主程序的 p 是刚才被修改后的那个值 即 10;
      

  13.   

    changeAge里面自己改成了10当然就是10了,后面一个赋值出了方法作用域后就无效了。