AClass a = new AClass();
BClass b = new BClass();
b.j=5;
a.aMethod(b);
j=b.j;// why j will be 20, not 100? 清说的详细一点。class AClass {
  void aMethod (BClass bb) {
    bb.j = 20;
    bb= new BClass ();
    bb.j = 100; 
   }
 } class BClass {
  int j = 0;//I guess it should be accessable by public.
 } 程序也许有错,意思大概就是这样。为什么J=20?不是100?

解决方案 »

  1.   

    bb.j = 20;
    //这里的bb指向第一个BClass b所对应的实例;
        bb= new BClass ();
    //从新指向一个新的BClass实例 ,bb的指向已经改变
        bb.j = 100; 为新对象给值
    j=b.j;---这里的b指向第一个BClass b 所对应的实例个
    关键要理解java是引用传值
      

  2.   

    因为在aMethod中,无论bb还是无名的new BClass,都是局部变量,所以当退出函数以后,都离开了自己的生命域,所以无效.我把程序改为如下:     public class testAB {         public static void main(String args[]) {AClass a = new AClass();
    BClass b = new BClass();
       
    b.j=5;
    System.out.println("b.j="+b.j);
     System.out.println(" b before come to aMethod is "+b.toString());
    a.aMethod(b);
     System.out.println(" b after come to aMethod is "+b.toString());
    System.out.println("b.j="+b.j);
    }
    }class BClass {
      int j = 0;//I guess it should be accessable by public.
      public BClass(int a){
       j=a;
       }
      public BClass(){}
     } 
    class AClass {
      void aMethod (BClass bb) {
        bb.j = 20;
        System.out.println(" bb just come to aMethod is "+bb.toString());
        bb=null;
        //System.out.println("bb.j="+bb.j);
        bb= new BClass ();
        bb.j = 100; 
        System.out.println("bb.j="+bb.j);
         System.out.println(" bb after new classed is "+bb.toString());
        
       }
     } 
    结果运行testAB时,输出是:b.j=5
     b before come to aMethod is BClass@1a5ab41
     bb just come to aMethod is BClass@1a5ab41
    bb.j=100
     bb after new classed is BClass@18e3e60
     b after come to aMethod is BClass@1a5ab41
    b.j=20
    后面是唯一的对象的hashcode,可见在aMethod中bb的确指向了新的对象,可是退出了aMethod之后,一切有恢复了,b还是指向原来的b,即hashcode仍然是1a5ab41