黑马程序员技术交流社区

标题: 问题一个新手问题,如果太简单大家见谅 [打印本页]

作者: 移动小坦克    时间: 2013-2-28 23:08
标题: 问题一个新手问题,如果太简单大家见谅
本帖最后由 韩松范 于 2013-3-12 02:36 编辑

这是我当年上学的时候遇到的问题
好像跟传地址有关,但是知道的不是很清楚,所以请大家指教
顺便问一下如果是c++遇到类似的情况会怎样?
class Test
{
     private String name;
     public void setName(String name)
     {
           this.name = name;
    }
    public String getName()
   {
         return name;
   }
}
class Demo{
   public static void main(String[] arg) {
       Test obj = new Test();
           myFun(obj) ;
           System.out.println("obj"+obj.getName());
  }
  public static void myFun(Test t){
       Test t2 = new Test();
           t2.setName("cba');
           t.setName("abc");
           t = t2 ;
  }
}

打印出来的是"abc" ,而不是"cba",为什么是这样?

作者: 罗海云    时间: 2013-2-28 23:26

  1. <P>package com.itheima.p1.text;</P>
  2. <P>
  3. import java.util.ArrayList;
  4. class Test
  5. {
  6.      private String name;
  7.      public void setName(String name)
  8.      {
  9.            this.name = name;
  10.     }
  11.     public String getName()
  12.    {
  13.          return name;
  14.    }
  15. }
  16. class Text{
  17.    public static void main(String[] arg) {
  18.        Test obj = new Test();
  19.            myFun(obj) ;
  20.            
  21.            System.out.println("obj: "+obj.getName()); //既然下面都已经赋成功了.为什么会出现这种情况..是因为看下面
  22.   }
  23.   public static void myFun(Test t){   // 这儿Test t是形参,,相当于就是myFun中的一个局部变量...修改这个完全不起作用..
  24.        Test t2 = new Test();
  25.            t2.setName("cba");
  26.            t.setName("abc");
  27.            t = t2 ; //这儿我测试了是,,其实这儿是赋值成功了的....
  28.            System.out.println(t.getName());
  29.   }
  30. }
  31. </P>
复制代码
下面是我改了的代码..就行了.
  1. package com.itheima.p1.text;


  2. import java.util.ArrayList;
  3. class Test
  4. {
  5. private String name;
  6. public void setName(String name)
  7. {
  8. this.name = name;
  9. }
  10. public String getName()
  11. {
  12. return name;
  13. }
  14. }
  15. class Text{
  16. public static void main(String[] arg) {
  17. Test obj = new Test();
  18. Test t = myFun(obj) ;

  19. System.out.println("obj: "+t.getName());
  20. }
  21. public static Test myFun(Test t){
  22. Test t2 = new Test();
  23. t2.setName("cba");
  24. t.setName("abc");
  25. t = t2 ;
  26. System.out.println(t.getName());
  27. return t;  ///需要把已经付好值得对象返回..
  28. }
  29. }
复制代码

作者: 贾文泽    时间: 2013-2-28 23:47
本帖最后由 贾文泽 于 2013-2-28 23:51 编辑

{:soso_e127:}
作者: 谢洋    时间: 2013-2-28 23:57
class Demo{
   public static void main(String[] arg) {
       //其实这里的obj是代表指向Test的某个对象的地址,
       //在实际操作中是根据obj所代表地址去找这个对象,再对这个对象进行操作
       Testx obj = new Testx();
         
       myFun(obj) ; //这里只是把obj对象的地址赋给了t
       //通常的操作是把返回结果赋给obj,但这个函数没有返回值
       // obj=myFun(obj);
       System.out.println(obj.getName());
       System.out.println("打印obj的hashcode"+obj.hashCode());
  }
  public static void myFun(Testx t){
        Testx t2 = new Testx();
        System.out.println("打印t2的hashcode"+t2.hashCode());
        t2.setName("cba");
        t.setName("abc");
        System.out.println("打印t被赋值前hashcode"+t.hashCode());
        t = t2 ;
        System.out.println("打印t被赋值后hashcode"+t.hashCode());
        System.out.println(t.getName());
        System.out.println(t2.getName());
  }
}
//上面是我改写的代码改,其实这个问题不简单
//从Object继成过来的hashcode()返回结果与对象的地址密切相关
//从测方式结果来看,不难发现是什么原因了

作者: 杨剑    时间: 2013-3-1 00:09
这个现象只要把内存图画出来就清楚了

详细过程.png (33.47 KB, 下载次数: 77)

运行详细过程

运行详细过程

作者: 移动小坦克    时间: 2013-3-1 21:10
杨剑 发表于 2013-3-1 00:09
这个现象只要把内存图画出来就清楚了

很详细,谢谢。。。
作者: 杨剑    时间: 2013-3-2 14:50
韩松范 发表于 2013-3-1 21:10
很详细,谢谢。。。

呵呵,不用,只要点技术分就行了
作者: 移动小坦克    时间: 2013-3-2 19:43
杨剑 发表于 2013-3-2 14:50
呵呵,不用,只要点技术分就行了

这个不是我给的。。。。
作者: 李培根    时间: 2013-3-3 10:05
杨剑 发表于 2013-3-2 14:50
呵呵,不用,只要点技术分就行了

技术分来了,赞一个
作者: 胡勇敏    时间: 2013-3-3 11:06
内存图画的不错。理解引用变量的特点是指向内存地址,给引用变量赋值就是给它具体变量的内存地址就成了。
作者: 杨剑    时间: 2013-3-3 13:04
非常感谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2