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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class Test {

        int num = 3;
        public static void main(String[] args) {

                Test t = new Test();
                t.num = 5;
                method(new Test());
                System.out.println(t.num);
        }
        public static void method(Test t){
                t.num = 6;
        }
}

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

8 个回复

倒序浏览
哎,我也觉得应该是6才对啊,怎么是5呢?
回复 使用道具 举报
  1.        public static void method(Test t1){
  2.                 t1.num = 6;
  3.         }
复制代码
改一下
这是引用传递!堆中创建了一个T--num=3然后赋值t.num=5 所以t--num=5
方法method() 传了个T1 T1--num=6 更T没关系 所以t--num=5
回复 使用道具 举报
因为分别给两个对象赋值,他们之间没有关系,分清楚对象就好说了
回复 使用道具 举报
我也看晕了,Test t=new Test();到底是new了个啥
回复 使用道具 举报
  1. class Test {

  2.          int num = 3;
  3.          public static void main(String[] args) {

  4.                  Test t = new Test();
  5.                  t.num = 5;
  6.                  method(new Test());
  7.                  System.out.println(t.num);
  8.          }
  9.          public static void method(Test t){
  10.                  t.num = 6;
  11.          }
  12. }
复制代码

这是一个很有意思的东东。
关键在于method方法调用,其实第一步:Test t = new Test(); 这个new Test()会有一个地址值,比如说是:0x0011
那么这个t指向的就是0x0011指向的一个堆内容。t.num = 5;是对地址为0x0011Test类操作的。
第二步:method(new Test());这里的new Test()会有一个新的地址值,比如:0x0022
传到method方法里,method方法里又将0x0022地址赋值给(anotherTest),虽然在这里表面上看都t,其实与main方法里的t并不是同一个t。
然后,在method方法里t.num = 6 ,就不难理解了,这里是给 0x0022 指向的Test内容赋值。再回到main方法里,System.out.println(t.num);这里输出的仍然是0x0011指向的是内容。所以就是输出的是5.

回复 使用道具 举报
samove 发表于 2015-7-5 19:53
这是一个很有意思的东东。
关键在于method方法调用,其实第一步:Test t = new Test(); 这个new Test()会 ...

流弊,真详细...关于内存这块就是搞不懂
回复 使用道具 举报
method方法中没有返回值
回复 使用道具 举报
这个有点绕,不过好还是看方法是传形式参数还是实际参数,然后记住就近原则,  还有每New下就是个新的对象,指针对以前是没有影响的,就像String一样,他本身就是一个对象,值不会发生改变,我们使用它很可能就是新的一个String
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马