有这样一个问题,测试FootBall这个类,一共被调用了几次,并且调用的顺序其中GetID是查出某个对象是第几个被创建出来的。。getHowMany是一共创建了几个在Football里面,如果把计数器放在了构造器里面,如果我下次再写新的构造器,那么这个num是不会往上加的,也就是说我以后每写一个构造器,都要加num++这句话。放在非静态方法体里面也是由问题的,因为如果FootBall这个类里面有个静态方法,我直接调用这个静态方法,计数器也是不会往上加的。请问,有什么好办法吗??
public class GetHowManyProject {
public static void main(String[] args) {

FootBall footBall1 = new FootBall();
System.out.println("I am the " + footBall1.getID());
FootBall footBall2 = new FootBall();
System.out.println("I am the " + footBall2.getID());
FootBall footBall3 = new FootBall();
System.out.println("I am the " + footBall3.getID());
FootBall footBall4 = new FootBall();
System.out.println("I am the " + footBall4.getID()); FootBall.staticMethod();

System.out.println("there are " + footBall3.getHowMany());
}}class FootBall {
private static int num = 0;
private int id; int getID() {
id = num;
return id;
} int getHowMany() {
return num;
} // 将计数器写在构造器里面是有问题的,因为万一客户程序员没有调用FootBall构造器怎么办?
// FootBall() {
// num++;
// } // 放在非静态方法体里面也是有问题的,因为万一有一个static方法怎么办?(static方法是不会调用非静态构造器的)
{
num++;
} static void staticMethod() { }
}

解决方案 »

  1.   

    那你就在football里  自己写个  生成对象的方法
      

  2.   

    。。那如果别人调用的是FootBall.staticMethod()我也应该往上加一次,怎么加
      

  3.   

    LZ的设计有点小问题:
    int getID() { 
    id = num; 
    return id; 

    num是全局变量,多个对象共同用一个num,这个id就是num,如果像下边那样写就出问题了:
    FootBall footBall1 = new FootBall(); 
    FootBall footBall2 = new FootBall(); 
    FootBall footBall3 = new FootBall(); 
    FootBall footBall4 = new FootBall(); System.out.println("I am the " + footBall1.getID()); 
    System.out.println("I am the " + footBall2.getID()); 
    System.out.println("I am the " + footBall3.getID()); 
    System.out.println("I am the " + footBall4.getID()); 
    LZ的设计还是不够灵活啊
      

  4.   


    我不理解这句:“如果别人调用的是FootBall.staticMethod()我也应该往上加一次”
    为什么别人调静态方法,num要加?num不是表示生成对象的个数吗?调静态方法也没增加新的对象啊。
      

  5.   

    把num设置成为静态数组对象
    然后用你的id做数组的下标 计算当前id一共调用了几次
      

  6.   


    不好意思   我没说全   把构造方法私有  就是不能在类外new出来
    自己的类里提供一个方法专门new
      

  7.   


    new出来的都能往上增加。但是如果不是new出来的呢???new不new个对象,怎么new不是解决问题的关键啊,还是那句话,如果不是new出来的,这个数量怎么往上加
      

  8.   


    “其中GetID是查出某个对象是第几个被创建出来的。。getHowMany是一共创建了几个”
    如果你想知道一个对象是第几个被创建出来的,那么你使用new生成对象时,一定会对全局变量进行更改
    所以如果你新增了构造函数,不可避免的也要加上num++;
    而一共创建了几个就是你调用构造方法的次数,如果构造方法中进行了累计,这个数字也自然可以统计到。对于你在下面说的不是new出来的,也就是使用静态方法也要加,这个与你说的创建是有矛盾的,如果你的静态方法是个工厂方法,那么里面也会用到new构造函数,如果只是一个
    简单的静态方法,那么如果也想记数,那就要把这个方法的最后也要加上num++;
    如果你用
    FootBall实例.非静态方法()这种形式算不算是计数呢??
    如果也想记数,那没办法也加上num++;吧。
    总而言之,如果你的需求就是无论是调用这个类的构造方法、静态方法、非静态方法都想记数,那只能在每一个方法中加入num++;这个记数语句。。因为你想统计~~~