class PassParam
{  
  int x;
  public static void main(String[] args)
{
  PassParam obj = new PassParam();
  obj.x = 5;
  change(obj);
  System.out.println(obj.x);
} public static void change(PassParam obj)
{
  obj = new PassParam();
  obj.x = 3;
  System.out.println(obj.x);
}
}
这段代码的红色打印出来应该是5,蓝色打印出来应该是3,单个打印都没错,但一块打印时却是5和3,
清高手指点!
谢谢啊

解决方案 »

  1.   

    的确是这样的。Java是传引用调用,不用怀疑。
      

  2.   

    change()的obj = new PassParam();
    方法使obj指向了和原来不同的地方,所以两个obj就不是代表同一个实例了。
    如果把change()方法中的obj = new Passparam();去掉,则都为3了。
      

  3.   

    我试着跟lz说一下我的理解,如有错误的地方,还请各位前辈指教
    ----------------------------因为你的main()方法以及change(PassParam obj)方法分别实例化了一次
    PassParam obj 对象,相当于分配了不同的内存,假设main()中的实例化对象分配的内存叫1
    change(PassParam obj)中实例化分配的内存叫2main()中,你先给1的对象赋值为5,即obj.x = 5;那么,当你在main()中分配好1之后,调用了change(obj),这时change(obj)方法中
    obj = new PassParam()又分配了2 (此时,1和2引用的不是一个内存地址),
    这时obj.x = 3意为你给2的对象赋值为3,此时的输出即为3在main()方法中执行完change(obj)后,紧接着执行的是System.out.println(obj.x)
    这时的obj是1的对象,因为之前所赋值为5,所以此时输出的即为5
      

  4.   

    不是只有一个类吗?
    main方法中先调用了change方法,在执行红色的语句。
    蓝色语句在change方法中,所以先掉用蓝色语句
      

  5.   

    肯定是3,5啊!
    在change方法里面输出了3,main里面输出了5.有什么好奇怪的?
      

  6.   

    class   PassParam
    {    
        int   x;
        public   static   void   main(String[]   args)
    {
        PassParam   obj   =   new   PassParam();
        obj.x   =   5;   //一个obj入栈了
        change(obj);//调用 change
        System.out.println(obj.x);//这是栈中还是你初次new的那个obj 所以还是5
    }//main结束了  main的obj也结束了。public   static   void   change(PassParam   obj)
    {
        obj   =   new   PassParam();//这里你又new了一个 所以可以想象一个新的对象obj压在了上一个main中的obj的上面
        obj.x   =   3;//新对象的x被你复制为3
        System.out.println(obj.x);//输出的是栈顶的obj的x
    }//change结束 这个新new的obj的生命结束了。
    } 3,5写的不好,有不对的地方请见谅
      

  7.   

       
        obj.x   =   5; 
        change(obj); //先调用了change()这个功能块,这个功能里输出了3。
        System.out.println(obj.x); //这里输出了5。    所以按顺序应该是先输出3,然后输出5,答案不错吧?不知道这样解释对不对