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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© love~陌 中级黑马   /  2014-3-7 07:16  /  1353 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class TestChinese
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 new Chinese();
  6.                 new Chinese();
  7.                 new Chinese();

  8.         }
  9.         public static void sop(Object obj)
  10.         {
  11.                 System.out.println(obj);
  12.         }
  13. }
  14. class Chinese
  15. {
  16.         private static int count=0;
  17.         public Chinese()
  18.         {
  19.                 TestChinese.sop(++count);
  20.         }
  21. }
复制代码
程序运行结果为
1
2
3
若是将
private static int count=0;
改为
private int count=0;
运行结果为
1
1
1
这里求大神详细讲解一下static起到的修饰作用。修改之前,每次创建对象Chinese,count能够叠加;修改之后,count不会叠加,初始值都是0
(请就我这个例子讲解,不需要宽泛的定义copy,谢谢)
另外一个问题:public Chinese(){}这个函数是构造函数吗?每次新建对象Chinese的时候,public Chinese(){}就运行一遍?


评分

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

查看全部评分

3 个回复

倒序浏览
这样说吧,用static 修饰的只在内存中存储一份,每次创建对象,++count是同一个count,所以叠加.去掉static修饰,每个创建的对象都有一个count 。
第二个问题:你创建对象都是无参的,创建一个调用一次构造函数

评分

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

查看全部评分

回复 使用道具 举报
如果将域定义为static,每个类中只有这样一个域。而每一个对象对于所有的实例域却都有自己的一份拷贝。
就是说静态域它属于类,而不属于任何独立的对象,(静态域就是静态变量,实例域就是非静态变量)。
构造器与类同名,可以有0个,1个或一个以上的参数,没有返回值,总是伴随new操作一起调用。
所以当你调用new Chinese()时,如果是静态变量,这个类的所有对象将共享一个count域,结果是1,2,3.
而如果是非静态变量,他将产生3个实例域,即3个count都是1。结果就是1,1,1.

评分

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

查看全部评分

回复 使用道具 举报
static修饰成员变量的时候,这个成员变量就是静态变量也就是类变量,随着类的加载而加载,随着类的消失而消失,所以有static的时候会累加,没有static修饰的时候,就是普通成员变量,随着对象的创建而生成,所以不会累加。第二问题:是构造函数,随着对象的创建就运行一次!

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马