我创建了一个类,定义了一个对象,用了俩个方法分别去修改他修改他,
第一种在方法里面修改所传参数的属性,实际参数也修改了,
第二种在方法里面我重新定义了一个对象并赋值给所传递的参数,可是实际参数并没有修改,这是为什么
(java中对形式参数的操作实际上就是对实际参数的操作嘛,不然第一个方法就不会成功了,可是第二个方法为什么不成功),
代码如下:public class Main {
int i;
String name; public static void main(String[] args) {

Main main01=new Main();
main01.i=1;
main01.name="张三";
//Main对象的引用传递方法一,设置年龄为19,姓名为李四;
set_info01(main01, 19, "李四");
System.out.println("main01姓名:"+main01.name+" 年龄:"+main01.i);
//Main对象的引用传递方法二,在该方法中重新实例化了一个Main类对象,初始值年龄为1,姓名为张三;
set_info02(main01);
//按照方法里面的操作,这里该打印:main01姓名:张三 年龄:1 ,可是他仍然打印 main01姓名:李四 年龄:19;

System.out.println("main01姓名:"+main01.name+" 年龄:"+main01.i);

/*可是set_info01成功修改了所传递的实际参数main01对象 的值,而set_info02则只是修改了
方法里面形参的值,实际参数main01对象 的值并没有修改,
为什么修改所传递的对象的属性能成功(set_info01方法),而直接修改对象本身不行呢(set_info02方法)。

*/

/*引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)
被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,
方法执行中形式参数值的改变将会影响实际参数的值。
所以上面两个方法,可以等同于(下面)的两种操作:
*/
Main main02=new Main();
main02.i=1;
main02.name="张三";
//------------------等同于set_info01的操作;
main02.i=19;
main02.name="李四";
System.out.println("main02姓名:"+main02.name+" 年龄:"+main02.i);

//------------------等同于set_info02的操作;
Main main03 = new Main();
main03.i = 1;
main03.name = "张三";
main02=main03;
System.out.println("main02姓名:"+main02.name+" 年龄:"+main02.i);

} public static void set_info01(Main m, int i, String name) {
m.i = i;
m.name = name;
} public static void set_info02(Main m) {
Main main01 = new Main();
main01.i = 1;
main01.name = "张三";
m = main01; }}
控制台信息打印:
main01姓名:李四 年龄:19
main01姓名:李四 年龄:19
main02姓名:李四 年龄:19
main02姓名:张三 年龄:1求解啊,各位,大神,师兄姐妹们.....java 

解决方案 »

  1.   

    是不是当java调用方法传递一个引用值的时候会新建一个存储同样地址的引用变量,这样形参和实参的指向就一样,都是存在同一个对象的地址,也就是形参和实参的所指向的值一样,但是本身却不是一回事。所以,1.当我修改他的属性的时候,他会去寻找这个引用所真正指向的对象下面的属性并修改,2.而当我直接修改参数本身,就等于是修改了一个存储地址的一个变量,而无法修改原先这个参数所指向的对象本身。
      

  2.   

    实参main01是一个引用,形参m是另一个引用,我们调用方法set_info02(main01),使main01和m这两个引用指向了同一个对象(李四)。
    在set_info02()中,创建了一个新的对象(虽然它也叫main01,但并不是那个作为实参的main01,这里要格外注意),然后让m指向了这个新的对象(张三)。
    我们注意到,在方法调用的过程中,只是让形参m指向了其他对象,而实参main01依然指向原来的对象。书上的不一定就是对的,要自己做实验验证一下。我刚看了这学期的Java课本,随便一翻就找出一大把错误,实在是无语。
      

  3.   

    Java只要值传递没有所谓的引用传递
      

  4.   

    Java中有引用传递?什么叫“引用传递”?,在说C++吗。Java根本不是这么回事!首先关于中国人尤其是受<谭浩强>荼毒的一大群人,始终受其所谓“形参”和“实参”的概念困扰,国外在在上个世纪80年代开始就已经不在用“形参”和“实参”的提法了,这是很不严谨的,会造成概念上的严重误区。Java中,所有的参数传递都是值传递,你们可以上Sun的官方网站查这句话,SCJP认证已经明确“值传递”是Java中唯一的传递参数的方式。