public class Test{
public static void changestr(String str){
str = "welcome";
}
public static void main(String []args)
{
String str = "1234";
changestr(str);
System.out.println(str);
}
}
输出结果为什么是 1234??求高手指点···
public static void changestr(String str){
str = "welcome";
}
public static void main(String []args)
{
String str = "1234";
changestr(str);
System.out.println(str);
}
}
输出结果为什么是 1234??求高手指点···
解决方案 »
- 怎么设置图片适合swing组件
- Struts2中的传值方式的好处与坏处
- 线程中的notify和wait的问题.
- Launch4j 教程,jar转exe免费开源工具
- 请教java运行的问题,各位大侠帮帮我好吗?
- 请问加了package org.javarearch.book.j2seimproved.nio;就不能执行呢?
- 问一下,JTextArea框里面空白的话getText()会返回啥?
- 文件读写问题!50分!
- Recover from single *.mdf file
- 学JAVA有什么好书?JAVA2核心技术?
- 线程这章,关于synchronized锁,帮忙分析下
- 从静态方法中引用非静态变量,小不解
你在方法里做的事只是把引用给从新赋了一个新值。但是之前的引用值并没有改变。
举个例子就是
int a=0;int b=a;
你在方法里使b=2;但是输出a还是0;
在changestr()中得到的引用str的地址不是‘1234’的实际内存地址,而是‘1234’拷贝的内存地址。所以不管你怎么change,原‘1234’还是不变的。
不像c/c++传指针
要想通过一个静态方法到达交换值的目的 是不可能的
再说String是不可变
str = "welcome";
}
这个的参数进来就被覆盖了,此str 非彼str。
public static void changestr(String str){
str = "welcome";
System.out.println(str);//加一行这个区分一下,str变量在方法里面是这个值,在方法外面,就是外面的值了
}
public static void main(String []args)
{
String str = "1234";
changestr(str);
System.out.println(str);
}
}
没什么关系 两个str
str = "welcome";
}
中的str 非main函数中的str,main函数中输出的是自己函数体中的str对象,因为其就是“1234”,故结果为“1234”,changestr函数中只是将其函数体中的str变量负值为"welcome",但没有输出,
就是说两个函数中的不是同一个对象。
String类是final类型的,不能改。
public static String changestr(String str){
str = "welcome";
return str;
}
public static void main(String []args)
{
String str = "1234";
str=changestr(str);
System.out.println(str);
}
}
上面的都人只要不加final,说String不变都是错误的.这个问题并不是从String不可变来说明的,而是从引用上来说的,
正如3楼所说,难道public static void main(String args[])
例如编译后,执行java Test 1234
这个args[]中的程序执行的参数能够被其他方法动态更改吗?
显然是不能的.
主函数中的str与changestr(String str)中的str是两个不同的引用,当调用函数时,把主函数中str引用指向的对象赋值给changestr(String str)中的str,即是changestr(String str)中str与主函数中的str指向同一个String对象,当函数中给str赋值是,由于String类型变量的不变性所以不是去改变"1234"(String str = "1234";)这个对象而是去创建另一个新的对象“welcome”(str = "welcome";),而changestr(String str)中的str这个引用指向它,而不是主函数中的str指向它,所以会出现这样的情况。
对于String类型变量的赋值,遵循下面的规则,java中有String pool(我估计是由于String对象的不变性,所以java中有String pool)。
java中有两种赋值方式,一种采用字面值方式的赋值,String s = "aaa"; 查找String pool中是否存在“aaa”这个对象,如果不存在,则在String pool 中创建一个"aaa"对象,然后将String pool中这个对象的地址返回给s这个引用,这样s会指向String pool 中"aaa"这个对象。如果String pool中已经有这个“aaa”对象时java虚拟机不会创建新的对象,而是将这个对象的地址直接返回。
另一种方式是String s = new String("aaa"); 首先在String pool 中查找有没有这个对象,如果已经有了,则不再String pool中创建了,而是在堆中创建该对象,然后返回堆中该对象的地址。如果没有,则在String pool中创建该对象,并且在堆中也创建该对象,最后返回堆中该对象的地址给s。
不像其他的非static 方法、变量、类一样、只是一个内存的引用、也就是在内存里copy一份、原值还是没变的、
http://topic.csdn.net/u/20110621/22/e2d58ec9-94cc-406d-adb4-70e5d96f3f9a.html?18227
一类的