黑马程序员技术交流社区
标题:
有个问题我一直不知道怎么回事。大家帮我看看
[打印本页]
作者:
游洪波
时间:
2012-6-26 00:21
标题:
有个问题我一直不知道怎么回事。大家帮我看看
本帖最后由 游洪波 于 2012-6-26 10:58 编辑
这是我之间学习过的一道题是关于内存存储的,
public class Demo{
public static void main(String args[]){
String str="hello";
System.out.println("之前的str"+str);//
这个输出是hello这个没有问题
fun(str);
System.out.println("之后的str"+str);//
问题就在这个输出的也是hello ,不是在fun方法中已经改变了吗?为什么还是hello而不是world呢?
}
public static void fun(String str1){
str1="world";
}
}
求各位高手帮我解答下吧..............................谢谢了!
作者:
丁二跃
时间:
2012-6-26 00:35
fun(str) 只是把 hello 的地址传进了方法,也就是给了str1
str1 在方法内,是一个局部变量
str1=“world“,把 world 的地址赋值给str1,str1由原来的指向 hello 变为指向 world
但是,整个过程 str 一直指向 hello,这是没有改变的,所以…………
作者:
张华廷
时间:
2012-6-26 00:41
class Demo
{
public static void main(String args[]){
String str="hello";
System.out.println("之前的str"+str);//这个输出是hello这个没有问题
fun(str);//
直接调用方法,输出语句在fun()方法中,下面的输出语句和fun()方法没有关系。
System.out.println("之后的str"+str
);//这个输出的是hello本来就正确的,因为str在main函数里面
}
public static void fun(String str1){
str1="world";
System.out.println("之后的str"+str1);
}
}
作者:
李伟
时间:
2012-6-26 01:10
public class Demo{
public static void main(String args[]){
String str="hello";
System.out.println("之前的str"+str);//这个输出是hello这个没有问题
fun(str);//
方法调用的参数是值调用而不是引用调用,这里调用的只是这个字符串的地址值
System.out.println("之后的str"+str);//问题就在这个输出的也是hello ,不是在fun方法中已经改变了吗?为什么还是hello而不是world呢? }
public static void fun(String str1){
str1="world";
}
}
作者:
黄连兵
时间:
2012-6-26 08:31
public class Demo{
public static void main(String args[]){
String str="hello";
//这个str是类的成员变量
System.out.println("之前的str"+str);//这个输出是hello这个没有问题
fun(str);
System.out.println("之后的str"+str);
}
public static void fun(String str1){
//这个str1只是方法的局部变量
str1="world";
//你这条语句是在对方法的局部变量进行操作的吧~,根本没有对类的成员变量产生任何影响!
}
}
当你用fun(str);语句调用方法的时候,实际上是把str的
值
传递或者叫做复制给了fun中的局部变量str1,方法调用结束后,此局部变量就销毁了。
作者:
Forever。
时间:
2012-6-26 08:43
java基本类型及其包装类采用值传递,对于对象采用引用传递。虽然string不是java里的基本类型,但是他同样不是按引用传递。
看一下API,不会找到能够改变String对象的方法。任何输出上的改变都是重建新的String对象,而不是在原对象基础上改变。改变的是变量的内容,即,不同对象的引用。
作者:
周朋飞
时间:
2012-6-26 10:34
其实给你举个例子 你就明白了 我们声明一个变量 String s = "Hello world!";
我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样回答是不准确的,其实
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:
String string = s;
我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象
只有当你使用new关键字的时候,我们才在堆里面创建了一个对象
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2