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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余银桂 中级黑马   /  2012-6-17 18:26  /  1535 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余银桂 于 2012-6-17 18:50 编辑
  1. public class Test{

  2.         private static int x=100;  //private 和 static 同时作用在变量上,那这个变量该怎么理解?
  3.         
  4.         public static void main(String[] args){
  5.                
  6.                 Test t1 = new Test();
  7.                 t1.x++;   
  8.                 System.out.println( x ); //这里是 101
  9.                 Test t2 = new Test();
  10.                 t2.x++;
  11.                 System.out.println( x ); //这里是102
  12.                 t1 = new Test();
  13.                 t1.x++;
  14.                 System.out.println( x ); //这里是103
  15.                 Test.x--;
  16.                 System.out.println( "x="+x ); //输出结果是x=102; 上面所有new的和没new的都一直在作用同一个x,为什么?
  17.                
  18.         }

  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 淡然 于 2012-6-17 18:47 编辑


  • public class Test{
  •         private static int x=100;  //private 和 static 同时作用在变量上,那这个变量该怎么理解?
                                                /*private是访问权限控制符,它表明x只能被本类对象使用。static是类变量修饰符,即它会把x放入内存中的静态存储区中,在内存中随着类的加载而存在,无论创不创建对象,或创建多少对象,它都只在内存中存在一份,所有对象共享。*/
  •         public static void main(String[] args){
  •                 Test t1 = new Test();
  •                 t1.x++;
  •                 System.out.println( x ); //这里是 101
  •                 Test t2 = new Test();
  •                 t2.x++;
  •                 System.out.println( x ); //这里是102
  •                 t1 = new Test();
  •                 t1.x++;
  •                 System.out.println( x ); //这里是103
  •                 Test.x--;
  •                 System.out.println( "x="+x ); //输出结果是x=102; 上面所有new的和没new的都一直在作用同一个x,为什么?
                                                               /*你可以这样理解,静态变量是类变量,不是对象变量,一个内存中同一个类不管创建多少对象它都只加载一次,所以不管你new没new对象,它在内存中都只存在一份,你操作的都是同一个x*/
  •         }
  • }

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
private修饰就是表示该属性x只能在该类中被访问
static修饰表示该属性x是类变量(静态变量)。
当Test类初始化完成之后,类变量也就随之初始化完成,以后不管程序创建多少个Test对象,系统不再为x类变量分配内存。而且,不管通过哪个Test对象来访问x类变量,底层都将转换为通过Test来访问x类变量。
到这里,应该明白了吧,你一直操作的是一个变量。

尽量不要使用类变量,原因有下:
1. 实例变量是生存周期与对象一样,而类变量则与类一样,比较耗费资源
2. 每次访问类变量的时候,都得转换为通过Test类去访问,性能不是很好。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
static 修饰的变量在内存中只有一个,所以无论你怎么new 都是操作一个x,一般用类名.变量名调用静态变量。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
车风波 发表于 2012-6-17 18:37
static 修饰的变量在内存中只有一个,所以无论你怎么new 都是操作一个x,一般用类名.变量名调用静态变量。 ...

哦,原来是这么回事,最近被new弄得有点混乱了...一下把这题也弄晕了
回复 使用道具 举报
淡然 发表于 2012-6-17 18:31
  • public class Test{
  •         private static int x=100;  //private 和 static 同时作用在变量 ...

  • 很详细,谢谢了,仔细想想,还是很简单的,这是我被那new给骗了...
    回复 使用道具 举报
    您需要登录后才可以回帖 登录 | 加入黑马