a=new A(); 不是传过来的对象了

解决方案 »

  1.   

    先搞清楚引用类型和简单类型的区别,还有函数调用的变量作用区域
    chang(a);此时a是main里的那个a
    a.i=2;此时的a还是main里的a,因为是引用类型
    a=new A();此时的a指向新的对象,以后的操作与原来引用的main里的a无关
    所以原来main里的a的属性只被前面的代码改成2
      

  2.   

    a=new A();
    a.i=3;
    这里的a是一个新对象!和传过来的a没有关系,
    所以是2
      

  3.   


    刚实验了下 main里的a id为15
    change后面的a地址为25了
    谢谢
      

  4.   

    public class A { 
    public int i=0; 

    public class Testt { 
    public static void main(String[] args) { //开始执行A a =new A(); //生成对象a,此时a.i = 0 
    a.i=1;    //将a.i 设置成1,此时a.i = 1
    chang(a); //调用chang方法,到下面看chang方法....<等待chang结束>,调用结束后,main中的a.i = 
              //2, (A a)中的a是形式参数,方法调用完成后,被释放。
    System.out.println(a.i); //输出a.i = 2
    } public static void chang(A a){ //在(A a)中,a是形式参数,在main方法中调用chang方法时将
                //main中的变量a 的地址赋值给(A a)中的a <地址传递>,也就是说现在 两个a都指向相同的
                //对象a.i=2;     //将a.i设置成2 ,此时main,(A a)函数中的a.i = 2a=new A(); //将(A a)中的a指向新的对象,此时两个a指向不同的对象 此时main中的a.i = 2 ,(A a)
               //中的a.i = 0a.i=3;     //将(A a)中的a.i设置成 3 ,此时main中的a.i = 2 ,(A a)中的a.i = 3


      

  5.   

    我想你这两个应该写在两个文件中,因为有两个public的class,如下这样,
    -----------------------------------------------------------
    /**
     * A.java
     */public class A
    {
            public int i=0;
    }--------------------------------------------------------------
    /**
     * Function.java
     */public class Function
    {
            public static void main(String args[])
            {
                    A a= new A();
                    a.i=1;
                    change(a);//将类A的对象a传递给函数change,由于a是引用变量,故为引用传递.
                    System.out.println(a.i);
            }        public static void change(A a)//接收引用变量类A的一个对象,a是形参,本可随意
            {
                    a.i=2; //这一句一定要理解为对传入的类A的对象的属性i进行更改设定,不要被字面的
    a或者什么符号之类的迷惑!也就是说我们可以将形参的(A a)改成(A b),此处改成b.i=2,是同样的

                    a=new A();//这里是新建了一个对象,局部变量,引用类型,不管上面如何变化,下面这两句都比不能改变的;但由于是局部变量,作用域仅仅在change函数内部有效,对外面的无效!
                    a.i=3;
            }
    }
    -------------------------------------------------------------------
    综合上面的分析,我们可以将所有的代码作出下面的等效表示:-----------------------------------------------------------
    /**
     * A.java
     */public class A
    {
            public int i=0;
    }--------------------------------------------------------------
    /**
     * Function.java
     */public class Function
    {
            public static void main(String args[])
            {
                    A b= new A();
                    b.i=1;
                    change(b);
                    System.out.println(b.i);
            }        public static void change(A c)
            {
                    c.i=2;
                    a=new A();
                    a.i=3;
            }
    }
    ---------------------------------------------------------------
      

  6.   

    其实你如果是将chang方法改成如下形式可能会好理解些:public static void chang(A b){ 
       b.i=2; 
       b=new A(); 
       b.i=3; 

    其中b是形式参数,当在main中调用chang方法时<  chang(a);  >将实参a赋值给了b,使a和b指向相同的对象,在这里要明白形式参数,实参,引用类型的概念。简单来说就是对象是引用类型<a 是引用类型>,引用类型在赋值的过程中使用的是对象的地址<指针>传递<a,b指向相同的地址>。在执行b = new A()语句后,a,b执行不同的对象<也就说他们指向的地址不相同了>,所以再执行b.i = 3 时对a对象没有影响了,a.i 依然是2;