0

我正在做一个相当简单的程序来了解静态和非静态方法和变量之间的区别,我以为我理解了,但我无法运行以下代码:

public class Zombie {
String name;
int serial = 0;
static int count = 0;

public Zombie(String name) {
this.name = name;
count++;
}

static String printStatus() {
String status;
if(count == 1) {
  status = (count + "zombie created so far");
}
else {
  status = (count + "zombies created so far");
}
return status;
}
String printZombie() {
String ident = (name + " is zombie " + serial);
return ident;
}

public static void main(String[] args) {
printStatus();

Zombie z1 = new Zombie("Deb");

printStatus();

Zombie z2 = new Zombie("Andy");

printStatus();

Zombie z3 = new Zombie("Carl");

printStatus();

z1.printZombie();
z2.printZombie();
z3.printZombie();
}
}

它应该有一个输出:

0 zombies created so far
1 zombie created so far
2 zombies created so far
3 zombies created so far
Deb is zombie 0
Andy is zombie 1
Carl is zombie 2

但我无法让它运行。我认为问题(至少其中一个)出在第一种方法上,但我无法弄清楚。count 应该是静态的,而其他两个变量不是,并且 printStatus 应该是静态的,但 printZombie 不是。有人可以向我解释一下吗?

4

4 回答 4

1

你完全正确:

1)“静态”和“非静态”之间的区别基本上是“类范围”和“每个对象实例”之间的区别。

2)您的“计数”从 0(创建第一个僵尸之前)变为 3(创建最后一个僵尸之后)。

3) 所有三个对象都引用相同的静态“计数”。

没有得到的是“串行”是如何递增的:(你有没有从你的代码示例中留下任何东西?

这是我从你的代码中得到的:

// Modified code
public class Zombie {
  String name;
  int serial = 0;
  static int count = 0;

  public Zombie(String name) {
System.out.println ("Zombie(" + name + "): serial=" + serial + ", count=" + count + "...");
    this.name = name;
    count++;
  }

  static String printStatus() {
System.out.println ("printStatus: count=" + count + "...");
    String status;
    if(count == 1) {
      status = (count + " zombie created so far");
    }
    else {
      status = (count + " zombies created so far");
    }
System.out.println ("  " + status);
    return status;
  }

  String printZombie() {
System.out.println ("printZombie: serial=" + serial + ", count=" + count + "...");
    String ident = (name + " is zombie " + serial);
System.out.println ("  " + ident);
    return ident;
  }

  public static void main(String[] args) {
    printStatus();

    Zombie z1 = new Zombie("Deb");
    printStatus();

    Zombie z2 = new Zombie("Andy");
    printStatus();

    Zombie z3 = new Zombie("Carl");
    printStatus();

    z1.printZombie();
    z2.printZombie();
    z3.printZombie();
  }
}

对应输出:

printStatus: count=0...
  0 zombies created so far
Zombie(Deb): serial=0, count=0...
printStatus: count=1...
  1 zombie created so far
Zombie(Andy): serial=0, count=1...
printStatus: count=2...
  2 zombies created so far
Zombie(Carl): serial=0, count=2...
printStatus: count=3...
  3 zombies created so far
printZombie: serial=0, count=3...
  Deb is zombie 0
printZombie: serial=0, count=3...
  Andy is zombie 0
printZombie: serial=0, count=3...
  Carl is zombie 0
于 2013-10-01T23:52:29.407 回答
1

static 是属于该类的上下文,非静态方法在对象的上下文下执行

printStatus();对于所有的僵尸来说都是一样的,而printZombie将取决于对象。

通常静态方法应该是独立的,就像数学函数一样。

Math.divide(NumberA, NumberB)

可以使用类本身作为引用在类外部调用静态属性/方法,如下所示:

Zombie.count, 如果你在类中,你可以像在你的 main 方法中一样使用它,但它可能看起来很混乱

于 2013-10-01T23:53:37.077 回答
1

无需实例化类即可访问静态方法,即 Zombie.printStatus(); 与 printZombie 方法相反,该方法只能在您创建新的 Zombie 对象时访问。

当你说你不能让它运行时,你是什么意思?怎么了?我认为它正在运行,但您没有将输出定向到控制台:

你应该这样做:

System.out.println(printStatus());

这是因为 printStatus() 只返回一个字符串。

于 2013-10-01T23:59:20.570 回答
1

很简单,静态变量无论实例化多少次,都只有一份副本。非静态变量则相反,即它们实例化的次数与副本数一样多。

于 2014-01-26T12:52:30.790 回答