A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李宁 中级黑马   /  2013-1-19 22:10  /  1718 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
本帖最后由 柴乔军 于 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对象

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1 赞一个!

查看全部评分

回复 使用道具 举报
个人理解:
你在main方法中new一个Student对象时,初始化变量number,当然第一次打印的是20,
当你调用change方法,传递了一个Student对象,在这个方法中,的确它有了一个新的引用,
但是,当change方法执行完毕后,那么在栈空间的引用变量student就会消失,会被jvm回收,
在main方法中,其实实际还是调用你原来创建的对象。

评分

参与人数 1技术分 +1 收起 理由
黄锦成 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
student.change(student);
System.out.println(student + "-----3--");//运行结果可以看出,这里的student对象还是最初初始化的引用,所以结果还是20,而不是30
因为,这是2个完全不同的对象,新new出来的
回复 使用道具 举报
名字混起来了吧,哈哈,二个student不是同一个东西,

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

假如你没有new的话,可能会变成30,。。。试着把方法里的student改成stu试试就能明白了。
作用域问题。。。
回复 使用道具 举报
本帖最后由 黄金龙 于 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的
因为直接找自己的变量而不去找你那个方法里面的变量...我也修改那代码..你研究下吧
回复 使用道具 举报
你在change里面改变了change方法局部变量student的指向,并改变新指向对象内部的内容,这一切与main函数的student对象没关系。在这个程序中,你一共创建了两个Student类对象。

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

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

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马