嗨!我正在阅读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数量的类,所以代码实际上应该永远不会完成运行。
谢谢!
答案 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;
}
}
}
如果您将两个类(Dog
和MyDogTest
)放在同一个.java
文件中,请注意只有MyDogTest
应声明为public
,否则程序将无法编译。
答案 2 :(得分:1)
实例化一个类将调用该类的构造函数。你没有定义一个,所以你的构造函数实际上是一个没有参数而没有body的构造函数,如下所示:
public Dog () {
}
当然,这个构造函数永远不会导致无限循环。
主要方法是在启动程序时调用的方法,因此只调用一次。
答案 3 :(得分:1)
请注意static
方法声明中的main()
关键字。这意味着该方法始终可访问,与特定的类实例无关。 (由于您来自Python世界,欢迎您阅读field modifiers)
您可以在某种程度上将其视为“外部”方法(意味着您始终可以在外部访问它并使用Dog.main(your string args)
执行它),这不是“了解”类存在。另请注意,您使用的多个类可以使用main
方法,在这种情况下,您应该通过在manifest
文件中声明它来确定哪个是真正的主要类,但这有点高级主题,留待您进一步研究
当然,正如其他人已经解释过的那样,main
方法是JVM在您执行程序时运行一次的特定方法。