1

やあ!Head First Java を読んでいますが、次のコードの動作を理解できません。

public class Dog {
    String name;
    public static void main(String[] args) {
        // make a Dog object and access it
        Dog dog1 = new Dog();
        dog1.bark();
        dog1.name = "Bart";

        // now make a Dog array
        Dog[] myDogs = new Dog[3];
        // and put some dogs in it
        myDogs[0] = new Dog();
        myDogs[1] = new Dog();
        myDogs[2] = dog1;

        // now acces the Dogs using the array references
        myDogs[0].name = "Fred";
        myDogs[1].name = "Marge";

        // Hmmm... what is MyDogs[2] name?
        System.out.print("last dog name is ");
        System.out.println(myDogs[2].name);

        // now loop through the array
        // and tell all dogs to bark
        int x = 0;
        while (x < myDogs.length) {
            myDogs[x].bark();
            x = x + 1;
        }
    }

    public void bark() {
        System.out.println(name + " says Ruff!");
    }

このコードによって生成される出力は次のとおりです。

null says Ruff!
last dog name is Bart
Fred says Ruff!
Marge says Ruff!
Bart says Ruff!

私はこれを理解するのに非常に苦労しています.IMOコードはある種の無限ループまで実行する必要があります. 私が理解していることから(そして以前にPythonでプログラミングしたことがあります):クラスがアクティブになると、メインメソッドが呼び出され、メインメソッド内で同じタイプのクラスがさらに2つ作成されます。(ここで理解できない部分が来ます->)新しいクラスが作成されると、そのメインメソッド内でさらに2つのクラスが作成されます..無限を作成するときに、上記の出力を生成するのはどうしてですかクラスの数なので、コードの実行が実際に終了することはありません。

ありがとうございました!

4

4 に答える 4

3

あなたはmain()方法を誤解しています。

main()プログラムの実行を開始すると、Java はこのメソッドを呼び出します。クラスをインスタンス化してもメソッド
は実行されません。main()クラスのコンストラクターを実行するだけです。

于 2013-01-04T15:44:17.750 に答える
2

投稿したコードは、Dogクラスの合計 3 つのインスタンスをインスタンス化するだけです。配列には 3 つのmyDogs要素があるため、whileループは必ず終了します。
不明な点は何ですか?

このmainメソッドは、プログラムの実行時にのみ呼び出されます。あなたのプログラムは次のように書くことができます (Java の初心者にとってはより明確だと思います):

class Dog {
    String name;
    public void bark() {
        System.out.println(name + " says Ruff!");
    }
}

public class MyDogTest {

    public static void main(String[] args) {

        // make a Dog object and access it
        Dog dog1 = new Dog();
        dog1.bark();
        dog1.name = "Bart";

        // now make a Dog array
        Dog[] myDogs = new Dog[3];
        // and put some dogs in it
        myDogs[0] = new Dog();
        myDogs[1] = new Dog();
        myDogs[2] = dog1;

        // now acces the Dogs using the array references
        myDogs[0].name = "Fred";
        myDogs[1].name = "Marge";

        // Hmmm... what is MyDogs[2] name?
        System.out.print("last dog name is ");
        System.out.println(myDogs[2].name);

        // now loop through the array
        // and tell all dogs to bark
        int x = 0;
        while (x < myDogs.length) {
            myDogs[x].bark();
            x = x + 1;
        }

    }

}

2 つのクラス (DogおよびMyDogTest) を同じファイル内に配置する場合は、としてのみ宣言する必要があることに.java注意してください。そうしないと、プログラムはコンパイルされません。MyDogTestpublic

于 2013-01-04T15:45:35.943 に答える
1

クラスをインスタンス化すると、クラスのコンストラクターが呼び出されます。定義しなかったので、コンストラクターは実際には、次のようにパラメーターも本体もありません。

public Dog () {

}

もちろん、このコンストラクターが無限ループを引き起こすことはありません。

main メソッドは、プログラムの開始時に呼び出されるメソッドであり、したがって 1 回だけ呼び出されます。

于 2013-01-04T15:52:01.087 に答える
1

メソッド宣言のstaticキーワードに注意してください。main()これは、メソッドが特定のクラス インスタンスに関係なく、常にアクセス可能であることを意味します。(あなたは Python の世界から来たので、フィールド修飾子について少し読んでも構いません)。
ある意味でそれを「外部」メソッドとして観察できます(つまり、いつでも外部からアクセスして で実行できますDog.main(your string args))、それはクラスの存在を「認識」していません。また、使用する複数のクラスがmainメソッドを持つことができることに注意してください。その場合、ファイルで宣言することによって、どれが本当にメインのクラスであるかを決定する必要がありmanifestますが、これは少し高度なトピックであり、さらなる研究のために残されています。
そしてもちろん、他の人がすでに説明したように、mainmethod は、プログラムを実行した瞬間に JVM が 1 回実行する特定のメソッドです。

于 2013-01-04T16:09:37.950 に答える