我创建了一个类,定义了一个对象,用了俩个方法分别去修改他修改他,
第一种在方法里面修改所传参数的属性,实际参数也修改了,
第二种在方法里面我重新定义了一个对象并赋值给所传递的参数,可是实际参数并没有修改,这是为什么
(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
第一种在方法里面修改所传参数的属性,实际参数也修改了,
第二种在方法里面我重新定义了一个对象并赋值给所传递的参数,可是实际参数并没有修改,这是为什么
(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
在set_info02()中,创建了一个新的对象(虽然它也叫main01,但并不是那个作为实参的main01,这里要格外注意),然后让m指向了这个新的对象(张三)。
我们注意到,在方法调用的过程中,只是让形参m指向了其他对象,而实参main01依然指向原来的对象。书上的不一定就是对的,要自己做实验验证一下。我刚看了这学期的Java课本,随便一翻就找出一大把错误,实在是无语。