黑马程序员技术交流社区

标题: 对象调用静态成员变量? [打印本页]

作者: 彭彪    时间: 2013-9-11 12:16
标题: 对象调用静态成员变量?
  1. package com.study;

  2. public class AccessProperty {
  3.         static int i = 47;                //定义静态成员变量
  4.         public void call(){                //定义成员方法
  5.         System.out.println("调用call()方法");
  6.         for(i=0;i<3;i++){
  7.                 System.out.println(i+" ");
  8.                 if(i==2){
  9.                         System.out.println("\n");
  10.                         }
  11.                 }
  12.         }
  13.         public AccessProperty(){        //定义构造方法
  14.         }
  15.         public static void main(String[] args){
  16.                 AccessProperty t1 = new AccessProperty();
  17.                 AccessProperty t2 = new AccessProperty();
  18.                 t2.i=60;                //将类成员变量赋值为60
  19.                 System.out.println("第一个实例对象调用变量i的结果:"+t1.i++);
  20.                 t1.call();
  21.                 System.out.println("第二个实例对象调用变量i的结果:"+t2.i);
  22.                 t2.call();
  23.         }
  24. }
复制代码
   为什么?    第二个实例对象调用变量i的结果   3             ?????
    t1.i++    中的i 是类成员变量i还是哪个?   执行完后什么结果?  为什么   t1.i++   执行完后i值变为3了?
    t2.i

搜狗截图20130911120455.png (63.36 KB, 下载次数: 47)

搜狗截图20130911120455.png

作者: 蓝骑    时间: 2013-9-11 12:33
你需要加深类内存的理解,一个对象无论有多少个实例,都会共享同一份类成员变量,就是说只要用static修饰的成员变量,就属于类,代码中: t1.call();经过方法的循环,经过循环,已经给i重新赋值了,并且经过循环已经把 i 的值变成3了,所以打印的是3.
作者: 周文斌    时间: 2013-9-11 12:39
t1.i++    中的i 是类成员变量i还是哪个?
答:必然是成员变量i。所谓t1.i即是调用t1所属类的成员变量i。。t1是AccessProperty类,自然调用的是上面04行的静态成员变量了。。

执行完结果应该是:
第一个实例对象调用变量i的结果:60   //20行结果:静态变量值是通用的。19行i被赋值为了60
调用call()方法                            //21行结果:i(此时i==61因为t1.i++,即60++)在for循环中被赋值为1,并参与循环。。
0
1
2
                                    //21行结果:当i==3时不满足i<3即循环结束

第二个实例对象调用变量i的结果:3    //22行结果 i自然是等于3了。。
调用call()方法                            //23行结果:i(此时i==3)在for循环中被赋值为1,并参与循环
0
1
2



我不太明白你问的啥意思。。我整体给你分析了一下。。。
作者: 蓝骑    时间: 2013-9-11 12:50
周文斌 发表于 2013-9-11 12:39
t1.i++    中的i 是类成员变量i还是哪个?
答:必然是成员变量i。所谓t1.i即是调用t1所属类的成员变量i。 ...

循环结束后,还会执行一次 i++ ;  当i=2的时候,还是满足循环条件。执行到 i=2 之后,i就变成了3,然后跳出循环条件。所以结果应该是3

作者: 张晓辉    时间: 2013-9-11 12:55
本帖最后由 张晓辉 于 2013-9-11 13:03 编辑

{:soso_e100:}

作者: 彭彪    时间: 2013-9-11 13:13
周文斌 发表于 2013-9-11 12:39
t1.i++    中的i 是类成员变量i还是哪个?
答:必然是成员变量i。所谓t1.i即是调用t1所属类的成员变量i。 ...

正解。。。

作者: 熊亮    时间: 2013-9-12 20:19
始终是一个成员变量i,在不停地被赋值罢了
作者: code_geass    时间: 2013-9-14 17:59
因为for里面是i=3而不是int i=3,所以i一直是成员的那个。
作者: 张文豪    时间: 2013-9-14 21:43
关键for(i=0;i<3;i++)就是这句, 这个i还是成员变量i,要是变成for(int i=0;i<3;i++)的话,t1.i++   执行完后i值会变成61 也就是你原来想的那个值




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