Head First Java示例解释需要

时间:2013-01-04 15:43:00

标签: java

嗨!我正在阅读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方法中,创建另外两个相同类型的类。 (现在这里有一个难以理解的部分 - &gt;)当创建新类时,在它的main方法中,还会创建另外两个类,依此类推。当它创建一个类时,它如何生成上面显示的输出infinte数量的类,所以代码实际上应该永远不会完成运行。

谢谢!

4 个答案:

答案 0 :(得分:3)

你误解了main()方法。

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

答案 1 :(得分:2)

您发布的代码只是实例化了Dog类的3个实例。 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文件中,请注意只有MyDogTest应声明为public ,否则程序将无法编译。

答案 2 :(得分:1)

实例化一个类将调用该类的构造函数。你没有定义一个,所以你的构造函数实际上是一个没有参数而没有body的构造函数,如下所示:

public Dog () {

}

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

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

答案 3 :(得分:1)

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