我有一个简单的Java理论问题。如果我编写一个包含main()方法的类以及其他一些方法,并且在该main方法中调用该类的实例(比如新的Class()),我有点困惑为什么不发生递归。假设我正在编写一个图形程序,该类中的其他方法创建一个窗口和绘图数据;在main方法中,我调用了一个类本身的实例,但只出现了一个窗口。这很好,这就是我想要的,但是直觉表明,如果我从内部创建一个类的实例,那么应该发生某种递归。什么阻止了这个?这是一个例子(在我看来,我想知道是什么阻止了不必要的递归):
public class example{
method1(){create Jpane}
method2(){paint Jpane}
method 3(){do some computations}
public static void main(String[] args){
new example(); // or create Jblah(new example());
}
}
答案 0 :(得分:8)
我认为你将main
方法 - 这只是程序的入口点 - 与构造函数混淆。
例如,如果你写了:
public class Example {
public Example() {
new Example(); // Recursive call
}
public static void main(String[] args) {
// Will call the constructor, which will call itself... but main
// won't get called again.
new Example();
}
}
然后会砰的一声。
答案 1 :(得分:1)
实例化类时,main
方法不会自动执行。它可以简单地用作应用程序的入口点 - 然后执行一次。
答案 2 :(得分:1)
递归并不是一件坏事。我怀疑你在问为什么没有无限的递归。
您缺少的一个重要概念是当您调用新的Example()时,您正在分配内存,然后只调用一个方法(构造函数)。 main()
仅在整个程序开始时调用,除非您明确调用它。
---编辑添加
public class MyMainClass {
public static void main(String arg[]) {
Calculator c = new Calculator();
int x = c.factorial(5);
}
}
class Calculator {
Calculator() { }
public int factorial(int x) {
if (x > 1) return x * factorial(x - 1);
else return 1; // WARNING: wrong answer for negative input
}
}
因为factorial不使用任何实例变量,所以它可能已被声明为static
并且在没有使用Calculator.factoral(5);
的情况下被称为new
,但是我不这样做,因为炫耀new
是这个例子的全部要点。
答案 3 :(得分:0)
只是因为你在类中有一个main方法并不意味着每次创建类时都会调用它。
Java将main视为程序的入口点,并在启动时调用它。你实例化的任何对象都不会调用main,因为就java而言,它已经完成了使程序的入口点的工作。