有这样一个问题,测试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() { }
}
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() { }
}
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的设计还是不够灵活啊
我不理解这句:“如果别人调用的是FootBall.staticMethod()我也应该往上加一次”
为什么别人调静态方法,num要加?num不是表示生成对象的个数吗?调静态方法也没增加新的对象啊。
然后用你的id做数组的下标 计算当前id一共调用了几次
不好意思 我没说全 把构造方法私有 就是不能在类外new出来
自己的类里提供一个方法专门new
new出来的都能往上增加。但是如果不是new出来的呢???new不new个对象,怎么new不是解决问题的关键啊,还是那句话,如果不是new出来的,这个数量怎么往上加
“其中GetID是查出某个对象是第几个被创建出来的。。getHowMany是一共创建了几个”
如果你想知道一个对象是第几个被创建出来的,那么你使用new生成对象时,一定会对全局变量进行更改
所以如果你新增了构造函数,不可避免的也要加上num++;
而一共创建了几个就是你调用构造方法的次数,如果构造方法中进行了累计,这个数字也自然可以统计到。对于你在下面说的不是new出来的,也就是使用静态方法也要加,这个与你说的创建是有矛盾的,如果你的静态方法是个工厂方法,那么里面也会用到new构造函数,如果只是一个
简单的静态方法,那么如果也想记数,那就要把这个方法的最后也要加上num++;
如果你用
FootBall实例.非静态方法()这种形式算不算是计数呢??
如果也想记数,那没办法也加上num++;吧。
总而言之,如果你的需求就是无论是调用这个类的构造方法、静态方法、非静态方法都想记数,那只能在每一个方法中加入num++;这个记数语句。。因为你想统计~~~