黑马程序员技术交流社区
标题:
关于引用地址的问题
[打印本页]
作者:
李宁
时间:
2013-1-19 22:10
标题:
关于引用地址的问题
class Student {
int number = 20;
public void change(Student student) {
student = new Student();student的引用地址已经改变了,指向一个新的对象
student.number = 30;
}
public static void main(String[] args) {
Student student = new Student();
int number = student.number;
System.out.println(number);
student.change(student);
int number1 = student.number;这里number的值应该为30吧,为什么还打印的是20?
System.out.println(number1);
}
}
复制代码
作者:
柴乔军
时间:
2013-1-19 22:40
本帖最后由 柴乔军 于 2013-1-19 22:46 编辑
package test;
class Student {
int number = 20;
public void change(Student student) {
student = new Student();// student的引用地址已经改变了,指向一个新的对象
student.number = 30;
System.out.println(student.number);
System.out.println(student + "----2---");
}
public static void main(String[] args) {
Student student = new Student();
System.out.println(student + "-----1--");
int number = student.number;
System.out.println(number);
student.change(student);
System.out.println(student + "-----3--");//运行结果可以看出,这里的student对象还是最初初始化的引用,所以结果还是20,而不是30
int number1 = student.number;
System.out.println(number1);
}
}
复制代码
运行结果:
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 编辑
class Student {
int number = 20;
public int change(Student student) {
student = new Student();//student的引用地址已经改变了,指向一个新的对象
return student.number = 30;//这里修改了一下代码方便看结果..
}
public static void main(String[] args) {
Student student = new Student();
int number = student.number;
System.out.println(number);//数值毫无疑问就是20.调用的就是一开始那个
//这里加了一个打印,很清楚的可以知道现在调用的是什么..
System.out.println(student.change(student));
//这里也是只调用了原来那个不是赋值的所以是20
int number1 = student.number;//这里number的值应该为30吧,为什么还打印的是20?----
System.out.println(number1);
}
}
复制代码
帮你修改了一下代码..方便你观看..
你的本身那2个打印都是没用到30的
因为直接找自己的变量而不去找你那个方法里面的变量...我也修改那代码..你研究下吧
作者:
黄锦成
时间:
2013-1-20 11:04
你在change里面改变了change方法局部变量student的指向,并改变新指向对象内部的内容,这一切与main函数的student对象没关系。在这个程序中,你一共创建了两个Student类对象。
你把change里面的student = new Student();注释掉就行了。
建议你在学习毕老师面向对象的视频时,到了毕老师画内存图时,你要注意看,不行的话就看多几遍
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2