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 中编程过):当类被激活时,main 方法被调用,然后在 main 方法中,创建了另外两个相同类型的类。(现在到了难以理解的部分——>)当新类被创建时,在它的 main 方法中,又创建了 2 个类,依此类推.. 当它创建一个 infinte 时,它​​怎么会产生上面显示的输出类的数量,因此代码实际上应该永远不会完成运行。

谢谢!

4

4 回答 4

3

你误解了main()方法。

main()当您开始执行程序时,Java 会调用该方法。
实例化一个类不会运行该main()方法;它只会运行类的构造函数。

于 2013-01-04T15:44:17.750 回答
2

您发布的代码仅实例化了该类的总共 3 个实例Dog。该myDogs数组有 3 个元素,因此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;
        }

    }

}

如果将两个类(DogMyDogTest)放在同一个.java文件中,请注意 onlyMyDogTest应该声明为public,否则程序将无法编译。

于 2013-01-04T15:45:35.943 回答
1

实例化一个类将调用该类的构造函数。您没有定义一个,因此您的构造函数实际上是一个没有参数且没有主体的构造函数,如下所示:

public Dog () {

}

当然,这个构造函数永远不会导致无限循环。

main 方法是在启动程序时调用的方法,因此只调用了一次。

于 2013-01-04T15:52:01.087 回答
1

注意方法声明static中的关键字。main()这意味着该方法始终是可访问的,与特定的类实例无关。(由于您来自 Python 世界,欢迎您阅读有关字段修饰符的内容)。
您可以在某种程度上将其视为“外部”方法(这意味着您始终可以在外部访问它并使用 执行它Dog.main(your string args)),而不是“意识到”类的存在。另请注意,您使用的多个类可以有main方法,在这种情况下,您应该通过在文件中声明它来确定哪个是真正的主要类manifest,但这是一个有点高级的主题,留待您进一步研究。
当然,正如其他人已经解释的那样,main方法是 JVM 运行一次的特定方法,在您执行程序的那一刻。

于 2013-01-04T16:09:37.950 回答