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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 游洪波 于 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";

    }

}
求各位高手帮我解答下吧..............................谢谢了!

6 个回复

倒序浏览
fun(str) 只是把 hello 的地址传进了方法,也就是给了str1
str1 在方法内,是一个局部变量
str1=“world“,把 world 的地址赋值给str1,str1由原来的指向 hello 变为指向 world
但是,整个过程 str 一直指向 hello,这是没有改变的,所以…………

点评

恩,写的清楚,呵呵,谢谢你。希望老师能给你点奖励!嘿嘿  发表于 2012-6-26 09:36
回复 使用道具 举报
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);

}

}
回复 使用道具 举报
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";

    }

}
回复 使用道具 举报
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,方法调用结束后,此局部变量就销毁了。

点评

我明白了谢谢你们,写的很清楚  发表于 2012-6-26 09:37
回复 使用道具 举报
java基本类型及其包装类采用值传递,对于对象采用引用传递。虽然string不是java里的基本类型,但是他同样不是按引用传递。
看一下API,不会找到能够改变String对象的方法。任何输出上的改变都是重建新的String对象,而不是在原对象基础上改变。改变的是变量的内容,即,不同对象的引用。
回复 使用道具 举报
其实给你举个例子 你就明白了  我们声明一个变量 String s = "Hello world!";
我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样回答是不准确的,其实
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:
  String string = s;
  我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象

  只有当你使用new关键字的时候,我们才在堆里面创建了一个对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马