public class Change_2 {
int a = 0; Change_2(int a) {
this.a = a;
} public static void main(String[] args) {
        Change_2 c = new Change_2(1);
System.out.println("ori Change_2:" + c.a);

change(c);System.out.println("after change:" + c.a); c=new Change_2(2); System.out.println("change Change_2:" + c.a);

System.out.println("change Change_2:" + c.a);
        }
        static void change(Change_2 c) {
c = new Change_2(2);
}}问题:我的CHANGE()方法和在 MAIN里的一 条语句是一样的都是c = new Change_2(2);但执行change(c)后,main里C没改变,但在main里执行c = new Change_2(2);C就改变了。为什么?

解决方案 »

  1.   

    static void change(Change_2 c) { 
    c = new Change_2(2); 
    // 此c非彼c
    }这个实际上又创建了一个新的对象。并且没有传递出去。而System.out.println("after change:" + c.a); 
    打印的是之前创建的对象的成员变量然后你又使用c 重新创建了一个object再去打印a的值。
    实际上是打印这个新的c的对象的成员变量。可以简单的理解 变量的作用域。 
      

  2.   

    因为你在change方法中给change方法的参数赋了新的对象,而没有改变main方法中的c!change方法中的c , 就像change方法的局部变量一样,只是引用的内存和main方法中的c是一块地方,你把change方法中的c重新引用别的地方,并不会改变main方法中的c.是不是不够清楚啊
      

  3.   

    change中改变的是形参
    影响不到main中
      

  4.   

    static void change(Change_2 c) { 
    c = new Change_2(2); 
    }} 这里的c只是传过来的对象的引用的COPY.
    只是change中的局部变量.退出change方法,这个c也就消失了.
      

  5.   

    change(c);
    JAVA里参数传值,是值传递.
    对于change(C),只是传递对象的一个拷贝,而引用对象是没有改变的.
      

  6.   

    别指望java去改变参数本身 在函数里面出现的跟参数同名的对象都是一个临时对象与传进来的那个无关 但是可以直接用c.a去改变它static void change(Change_2 e) { 
    e.a=5; 

      

  7.   

    我的BLOG有篇专门讲参数传递的文章