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 } }
我想你这两个应该写在两个文件中,因为有两个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; } } ---------------------------------------------------------------
chang(a);此时a是main里的那个a
a.i=2;此时的a还是main里的a,因为是引用类型
a=new A();此时的a指向新的对象,以后的操作与原来引用的main里的a无关
所以原来main里的a的属性只被前面的代码改成2
a.i=3;
这里的a是一个新对象!和传过来的a没有关系,
所以是2
刚实验了下 main里的a id为15
change后面的a地址为25了
谢谢
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
}
}
-----------------------------------------------------------
/**
* 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;
}
}
---------------------------------------------------------------
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;