class Number { 
   int i; 
} public class Assignment { 
   public static void main(String[] args) { 
Number n1 = new Number(); 
Number n2 = new Number(); 
n1.i = 9; 
n2.i = 47; 
System.out.println("1: n1.i= " + n1.i + ", n2.i= " + n2.i); 
n1 = n2; 
System.out.println("2: n1.i= " + n1.i + ", n2.i= " + n2.i); 
n1.i = 27; 
System.out.println("3: n1.i= " + n1.i + ", n2.i= " + n2.i); 
    } 
} 这段代码输出的结果是什么?最后一个输出语句为什么输出这种情况,请大家亲自操作一下再来回答,谢谢

解决方案 »

  1.   

    n1 = n2; 传的是引用。
    实例化对象时,对象和属性的值放到不同的内存空间。 
    n1.i = 27; 这样值都变为27了。
      

  2.   

    1: n1.i= 9, n2.i= 47
    2: n1.i= 47, n2.i= 47
    3: n1.i= 27, n2.i= 27Java中,都是传值调用,而不是传址调用,
    n1 = n2; 
    表示,n1指向了n2对象的引用, 就是n1,n2指向内存中同一个实体,
    既一个类创建的两个对象,如果具有相同的引用,那么就具有完全相同的实体,
      

  3.   

    Java中,都是传值调用,而不是传址调用,
      

  4.   

    n1 = n2;
    后引用n1, n2都指向同一个对象了, 所以修改引用n1指向的对象, 结果就是一样的了楼主需要理解引用和对象之间的区别, new的对象一般在堆里面, 而引用是放在栈里面, 相当于编译原理里面的符号表, 指向创建的对象
      

  5.   

    这个例子还是比较经典的。楼上也都回答的差不多了。
    大家还可以讨论一下HashMap的问题。
      

  6.   

    n1 = n2; 
    执行后,n1,n2都指向原来n2指向的对象。
    n1.i = 27; 
    执行后,n1,n2的内容都修改,因为它们本来就已经指向同一个对象了。
    所以输出结果都应该是27。
      

  7.   

    补充一句:
    用implements Cloneable可以实现对象克隆。
      

  8.   

    class Number { 
       int i; 
    } public class Assignment { 
       public static void main(String[] args) { 
    Number n1 = new Number(); // 创建一个实例,下面简称obj1
    Number n2 = new Number(); // 创建另一个实例,下面简称obj2
    n1.i = 9; // 为obj1实例的属性i赋值9
    n2.i = 47; // 为obj2实例的属性i赋值47
    System.out.println("1: n1.i= " + n1.i + ", n2.i= " + n2.i); 
    // 结果:1: n1.i= 9, n2.i= 47
    n1 = n2; // 实际含义为将n2的值传递给n1.n2的值为obj2,所以执行后,n1,n2的值都为obj2.
    // obj1被废弃.等待gc处理.
    System.out.println("2: n1.i= " + n1.i + ", n2.i= " + n2.i); 
    // 结果:2: n1.i= 47, n2.i= 47
    // 很明显,n1.i和n2.i都是obj2.i.所以都是47
    n1.i = 27; // 实际上是将47付给obj2.i
    System.out.println("3: n1.i= " + n1.i + ", n2.i= " + n2.i); 
    // 结果:3: n1.i= 27, n2.i= 27
    // 同上,n1.i和n2.i都是obj2.i.所以都是27
        } 
    }
    -------------------------------------------------------------
    有些人以类似以上的例子说明java并非全部值传递.实际上是理解错误.
    很明显至少这个例子中全部都是值传递.其他情况不说了.好长......
    大家应该能理解.
      

  9.   

    如果让我回答,我会和frilly(秋◆水) 回答的一样,呵呵!