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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请教一个静态代码块问题!为什么我的计数器不好使!哪里有问题啊!求指教!~~
代码如下:/* 设计一个表示用户的User类,类中的变量有用户名、口令和记录用户个数的变量,
* 定义类的3个构造方法(无参、为用户名赋值、为用户名和口令赋值)、获取和
* 设置口令的方法和返回类信息的方法。
* */

public class Test5_5 {

        public static void main(String[] args) {
                User u = new User("tonghuanchao","112300");
                System.out.println(u.info());
                System.out.println("用户个数:"+u.sum());
                User u1 = new User("tonghuan","1990");
                System.out.println(u1.info());
                System.out.println("用户个数:"+u1.sum());
        }

}
class User{
        private String userID ;
        private String password ;
        //定义一个计数器用来记录用户的个数。
        private int count;
       
        {
                System.out.println("构造块");
                 count++;
        }

        User(){
               
        }
        User(String userID){
                this.userID = userID;
        }
        User(String userID,String password){
                this.userID = userID;
                this.password = password;
        }
        public String getPassword() {
                return password;
        }
        public void setPassword(String password) {
                this.password = password;
        }
        //定义一个方法返回用户信息
        public String info(){
                return "用户名是:"+userID+"\r"+"密码是:"+password;
        }
        public int sum(){
                return count ;
        }
}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 wdtdcm 于 2014-3-2 11:46 编辑

构造块中只在加载类时运行一次
你再次录入用户时,构造块不再运行,
  1. {
  2.     System.out.println("构造块");
  3.     count++;
  4. }
复制代码

即是其中的count++不再运行了.另外
  1.         public String info(){
  2.     return "用户名是:"+userID+"\r"+"密码是:"+password;
  3.         }
复制代码
其中return后的东西要加个括号


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
要是计数的话,把count设定为static的吧。静态代码块随类的加载而加载,每次产生一个对象后,每个对象都有一个自己的count。变为静态的话,每产生一个对象,都会使公共的count加1的。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
wdtdcm 发表于 2014-3-2 11:45
构造块中只在加载类时运行一次
你再次录入用户时,构造块不再运行,

谢谢! 我把概念弄混了! 以为构造块是每次加载都运行呢
回复 使用道具 举报
volvoxc 发表于 2014-3-2 13:36
要是计数的话,把count设定为static的吧。静态代码块随类的加载而加载,每次产生一个对象后,每个对象都有 ...

静态代码块不是不管产生多少对象都只执行一次的吗?
回复 使用道具 举报
Person p=new Person("zhangsan",20);

该句话都做啦什么事情呢

1因为new用到了person.class所以会先找到person.class文件并加载到内存中。

2执行该类中的static代码块,如果有的话,给person.class类进行初始化。

3在堆内存中开辟空间,分配内存地址。

4 在堆内存中建立对象的特有属性,并进行默认初始化,

5对属性进行现示初始化

6 对对象进行构造代码块初始化

7对对象进行构造函数初始化

8将内存地址赋给栈内存中的p变量。
希望上面的文字对你理解程序都做啦什么动作,帮助你更好理解静态代码块,构造代码块,构造函数。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
平凡成就非凡 发表于 2014-3-2 21:02
Person p=new Person("zhangsan",20);

该句话都做啦什么事情呢

谢谢!我还想求教一下!当我把例子当中的count变量加static修饰以后,构造代码块就可以正常运行并正确的计数了,而我不加static 修饰 count就只会运行一次  这到底是怎么回事啊 !  我对这一块理解的不好!求大神指教指教!!!感谢
回复 使用道具 举报
男人丶要努力的 发表于 2014-3-3 10:03
谢谢!我还想求教一下!当我把例子当中的count变量加static修饰以后,构造代码块就可以正常运行并正确的 ...

你加啦static不叫构造代码块啦,叫做静态代码块。它的生命周期为类的加载到类的消失。就是你说的有效啦
回复 使用道具 举报
平凡成就非凡 发表于 2014-3-3 11:49
你加啦static不叫构造代码块啦,叫做静态代码块。它的生命周期为类的加载到类的消失。就是你说的有效啦 ...

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