调用方法改变对象的值问题,String,Integer经过调用方法不改变值 本帖最后由 w420372197 于 2011-10-03 20:39:06 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Java中的传递是值传递,changInteger(i) 把i引用的Integer对象的地址复制给changInteger(Integer i)方法中的i,也就是说方法中形参i与main方法中的i指向同一个对象(虽然二者名字相同,但是两个不同的引用变量)。在changInteger方法中使形参i重新引用另一个对象,这时,两个i指向不同的对象。其他也是这样。 main方法中的引用对象与方法中的形参所引用的是不同的对象。 给lz一个建议,弄清楚内存,什么作用域什么值传递引用传递的,都是浮云罢了。内存才是王道!栈内存和堆内存:基本数据类型的变量是放在栈内存里面,因为它有先后顺序的(只要上面的数据没有出栈,下面的都有效),所以他是有一定的范围的(假如在一个方法里面的传参数,是新的变量),他是可以重复利用的。堆内存则不同,他很动态,不连续,存放的时候是自己找空位,所以一般对象是放在堆内存,后面穿过去的事引用,change方法里的对象的引用还是指向先前的那块内存,改变的也是那块内存。初学者要深入学习java内存,很多问题都很容易理解了。 对于基本类型,我的理解是:(这里拿String类做例子)main方法中,str这个引用指向字符串"1234",然后它作为参数传递给了changeStr(str),在changeStr()方法中,一开始(还没有执行str="welcome";这条语句)时,这两个str应该是指向同一个字符串(值),并没有分别指向一个不同的字符串(值);而在执行了str="welcome";后,它才会新建一个String对象,str指向它,此时才存在两个String对象。你打印一下str的hashCode就知道了,在main方法中和在执行str="welcome";这条语句之前str的hashCode是相同的,赋值好之后就不同了!而对于非基本类型,这个应该好理解。 正解:package com.test;public class ChangeStrDemo { public static void main(String agrs[]) { Integer i = 12; changInteger(i); System.out.println(i); String str = "1234"; changStr(str); System.out.println(str); A1 a1=new A1(12,12); changA1(a1); System.out.println(a1); } public static void changStr(String str) { str = "welcome"; } public static void changInteger(Integer i) { i = 10; } public static void changA1(A1 a1) { a1=new A1(10,10); /*a1.a=10; a1.b=10;*/ }}class A1 { public int a; public int b; public A1(int a,int b){ this.a=a; this.b=b; } @Override public String toString() { return a+" "+b; } }结果:12123412 12 String,Integer 是final类型的类! 问个今天上午面试的题目? 请教高手关于图形旋转的问题。 SWING是怎样像J2EE那样保持一个用户的会话? 如何获得Rar.exe返回值 0,THANKS.... 用java怎样找到windows下的窗口? 请问如何在java中打开pdf文件(不使用runtime时)各位老大急救呀!! 两个标签怎样用连线连接? synchronized后面参数的意义是什么 救急!! 如何捕获System.out里输出的所有数据?必给分,分不够再加!!! 我快疯了,跪求java包的导入(写的servlet无法调用javabean) 为什么下面的代码执行完毕,结果是12test呢?搞不明白!
main方法中,str这个引用指向字符串"1234",然后它作为参数传递给了changeStr(str),
在changeStr()方法中,一开始(还没有执行str="welcome";这条语句)时,这两个str
应该是指向同一个字符串(值),并没有分别指向一个不同的字符串(值);而在执行了
str="welcome";后,它才会新建一个String对象,str指向它,此时才存在两个String对象。
你打印一下str的hashCode就知道了,在main方法中和在执行str="welcome";这条语句之前
str的hashCode是相同的,赋值好之后就不同了!而对于非基本类型,这个应该好理解。
package com.test;public class ChangeStrDemo {
public static void main(String agrs[]) {
Integer i = 12;
changInteger(i);
System.out.println(i); String str = "1234";
changStr(str);
System.out.println(str);
A1 a1=new A1(12,12);
changA1(a1);
System.out.println(a1);
}
public static void changStr(String str) {
str = "welcome";
} public static void changInteger(Integer i) {
i = 10;
}
public static void changA1(A1 a1) {
a1=new A1(10,10);
/*a1.a=10;
a1.b=10;*/
}}class A1 {
public int a;
public int b;
public A1(int a,int b){
this.a=a;
this.b=b;
}
@Override
public String toString() {
return a+" "+b;
}
}
结果:
12
1234
12 12