黑马程序员技术交流社区

标题: 关于引用地址的问题 [打印本页]

作者: 李宁    时间: 2013-1-19 22:10
标题: 关于引用地址的问题
  1. class Student {

  2.         int number = 20;



  3.         public void change(Student student) {

  4.                 student = new Student();student的引用地址已经改变了,指向一个新的对象



  5.                 student.number = 30;

  6.         }



  7.         public static void main(String[] args) {

  8.                 Student student = new Student();



  9.                 int number = student.number;



  10.                 System.out.println(number);



  11.                 student.change(student);



  12.                 int number1 = student.number;这里number的值应该为30吧,为什么还打印的是20?



  13.                 System.out.println(number1);

  14.         }



  15. }
复制代码

作者: 柴乔军    时间: 2013-1-19 22:40
本帖最后由 柴乔军 于 2013-1-19 22:46 编辑
  1. package test;
  2. class Student {

  3.         int number = 20;

  4.         public void change(Student student) {

  5.                 student = new Student();// student的引用地址已经改变了,指向一个新的对象

  6.                 student.number = 30;
  7.                
  8.                 System.out.println(student.number);
  9.                
  10.                 System.out.println(student + "----2---");

  11.         }

  12.         public static void main(String[] args) {

  13.                 Student student = new Student();
  14.                
  15.                 System.out.println(student + "-----1--");

  16.                 int number = student.number;

  17.                 System.out.println(number);

  18.                 student.change(student);
  19.                
  20.                 System.out.println(student + "-----3--");//运行结果可以看出,这里的student对象还是最初初始化的引用,所以结果还是20,而不是30

  21.                 int number1 = student.number;

  22.                 System.out.println(number1);

  23.         }

  24. }
复制代码
运行结果:
test.Student@18a992f-----1--
20
30
test.Student@4f1d0d----2---
test.Student@18a992f-----3--
20
关键问题在于你的change方法,虽然传入里一个student,但并未对原来的对象做任何修改,因为你将原来的引用改为了一个新的对象引用,
change方法里的student参数,应该说是方法的局部变量,而不是主函数中的student,只是同名而已,在内存中并不是一个对象,所以不影响主函数的
student的值,而在堆内存中,却出现了一个number为30的Student对象
作者: 罗利华    时间: 2013-1-19 22:45
个人理解:
你在main方法中new一个Student对象时,初始化变量number,当然第一次打印的是20,
当你调用change方法,传递了一个Student对象,在这个方法中,的确它有了一个新的引用,
但是,当change方法执行完毕后,那么在栈空间的引用变量student就会消失,会被jvm回收,
在main方法中,其实实际还是调用你原来创建的对象。
作者: 黑马-小龙    时间: 2013-1-19 23:32
student.change(student);
System.out.println(student + "-----3--");//运行结果可以看出,这里的student对象还是最初初始化的引用,所以结果还是20,而不是30
因为,这是2个完全不同的对象,新new出来的

作者: 王溢君    时间: 2013-1-19 23:33
名字混起来了吧,哈哈,二个student不是同一个东西,

你new了一个对象,改变的是局部的那个number=30,也就是方法里的那个,当你方法执行完后,student.number会消失。

假如你没有new的话,可能会变成30,。。。试着把方法里的student改成stu试试就能明白了。
作用域问题。。。
作者: 黄金龙    时间: 2013-1-20 01:19
本帖最后由 黄金龙 于 2013-1-20 01:22 编辑
  1. class Student {

  2.         int number = 20;



  3.         public int change(Student student) {

  4.                 student = new Student();//student的引用地址已经改变了,指向一个新的对象

  5.                return student.number = 30;//这里修改了一下代码方便看结果..

  6.         }

  7.         public static void main(String[] args) {

  8.                 Student student = new Student();

  9.                 int number = student.number;

  10.                 System.out.println(number);//数值毫无疑问就是20.调用的就是一开始那个

  11.                 //这里加了一个打印,很清楚的可以知道现在调用的是什么..
  12.                 System.out.println(student.change(student));
  13.                
  14.                //这里也是只调用了原来那个不是赋值的所以是20
  15.                 int number1 = student.number;//这里number的值应该为30吧,为什么还打印的是20?----

  16.                 System.out.println(number1);

  17.         }



  18. }
复制代码
帮你修改了一下代码..方便你观看..
你的本身那2个打印都是没用到30的
因为直接找自己的变量而不去找你那个方法里面的变量...我也修改那代码..你研究下吧
作者: 黄锦成    时间: 2013-1-20 11:04
你在change里面改变了change方法局部变量student的指向,并改变新指向对象内部的内容,这一切与main函数的student对象没关系。在这个程序中,你一共创建了两个Student类对象。

你把change里面的student = new Student();注释掉就行了。

建议你在学习毕老师面向对象的视频时,到了毕老师画内存图时,你要注意看,不行的话就看多几遍




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2