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

しかし、私はそれを実行することができません。問題(少なくともそのうちの1つ)は最初の方法にあると思いますが、わかりません。count は静的であるはずで、他の 2 つの変数はそうではなく、printStatus は静的であるはずですが、printZombie はそうではありません。誰かが私にこれを説明してもらえますか?

4

4 に答える 4

1

あなたはまさに正しいです:

1)「静的」と「非静的」の違いは、基本的に「クラス全体」と「オブジェクトインスタンスごと」の違いです。

2) あなたの「カウント」は 0 (最初のゾンビを作成する前) から 3 (最後のゾンビを作成した後) になります。

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、クラス内にいる場合は、メイン メソッドのように使用できますが、混乱を招く可能性があります。

于 2013-10-01T23:53:37.077 に答える
1

簡単に言うと、静的変数は、インスタンス化された回数に関係なく、コピーが 1 つしかありません。非静的変数は逆です。つまり、インスタンス化された回数と同じ数のコピーがあります。

于 2014-01-26T12:52:30.790 に答える
1

静的メソッドには、クラスをインスタンス化せずにアクセスできます。つまり、Zombie.printStatus(); 新しい Zombie オブジェクトを作成した場合にのみアクセスできる printZombie メソッドとは対照的です。

実行できないと言うとき、どういう意味ですか? 何が悪いの?実行されていると思いますが、出力をコンソールに送信していません:

あなたはこれをしているはずです:

System.out.println(printStatus());

これは、printStatus() が文字列を返すだけだからです。

于 2013-10-01T23:59:20.570 に答える