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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨彪 中级黑马   /  2012-8-16 18:08  /  1905 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Demo {
  2.         int temp = 30;
  3. }
  4. public class DemoTest1{
  5.         public static void main(String[] args) {
  6.                 Demo d1 = new Demo();
  7.                 d1.temp = 50;
  8.                 System.out.println("fun()方法调用前:" + d1.temp);
  9.                 fun(d1);
  10.                 System.out.println("fun()方法调用后:" + d1.temp);
  11.         }
  12.         public static void fun(Demo d2) {
  13.                 d2.temp = 1000;
  14.         }
  15. }
复制代码
结果不应该是:fun()方法调用前:50
                                    fun()方法调用后:50   
为什么这个运行结果是:fun()方法调用前:50
                                   fun()方法调用后:1000  
不在局部变量里吗 ?为什么会改变呢
  1. class DemoTest
  2. {
  3.         public static void main(String[] args) {
  4.                 String str1 = "hello";
  5.                 System.out.println("fun()方法调用前:" +str1);
  6.                 fun(str1);
  7.                 System.out.println("fun()方法调用后:" +str1);
  8.         }       
  9.         public static void fun(String str2)
  10.         {
  11.                 str2 = "WORD";
  12.         }
  13. }
复制代码
而这个运行结果就是:
fun()方法调用前:hello
fun()方法调用后:hello  
如果不改变这又是怎么回事啊?有点晕了

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
第一个是对象的引用,通过对象调用,里面的值对改变,第二个是局部变量,调用
public static void fun(String str2)

10.        {

11.                str2 = "WORD";

12.        }

这个方法只是改变了str2的值为“WORD”,而你打印的是
System.out.println("fun()方法调用后:" +str1);
,所以出来还是hello,至于str2会被垃圾收集器GC回收。
回复 使用道具 举报
第一个是实例变量
第二个是局部变量
回复 使用道具 举报
第一个情况:
                        fun(d1);d1是一个对象的引用,d1存储的值是地址值,调用fun(d1)方法后,会在方法区中重新定义
                        一个变量假如是p令p=d1此时p的值也是地址值指向d1所指的对象然后p.temp=1000,两者指的是同一
                        个对象所以打印的是1000

第二个情况:String这个类比较特殊若果你不是new String()那么他就不会在堆中创建对象而是在字符串常量池
                        中开辟一个空间存储,这和普通类型的变量一样了。fun(str1);str1的值是"Hello"那么调用
                        fun(str1)后,一样会在方法区中开辟快空间存储"Hello",假如是a,就是a="Hello";然后,对
                        a操作,a="World";只是改变的a没有改变str1.所以打印的还是"Hello"。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 刘圣伟 于 2012-8-16 19:03 编辑

* 字符串是一个特殊的对象;
* 字符串初始化就不可以被改变。
* String s1 = “abc"; si是一个类类型的变量,abc是一个对象。
* String s2 = new String(”abc“);
* 字符串最大的特点,一旦被初始化就不可以被改变。(常量)

而第一是对象的引用,所以是可以改变的,


class DemoTest
{
        public static void main(String[] args) {
                String str1 = "hello";
                System.out.println("fun()方法调用前:" +str1);
                fun(str1);
                System.out.println("fun()方法调用后:" +str1);
        }      
        public static void fun(String str1)
        {
                str1 = "WO";
                System.out.println("fun()方法中1:" +str1);
        }
}
fun()方法调用前:hello
fun()方法中1:WO
fun()方法调用后:hello


评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
第一个问题简单,因为你d1传到fun()中只是调用了该方法,该方法其实就执行这句代码d2.temp = 1000;

第二个问题就更简单了,因为你在看看你的代码System.out.println("fun()方法调用前:" +str1);

                fun(str1);

                System.out.println("fun()方法调用后:" +str1);

是不是都打印的hello,因为你都是打印str1嘛!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马