java类实例

时间:2013-02-07 18:39:18

标签: java recursion

我有一个简单的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()); 
         }
      }

4 个答案:

答案 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而言,它已经完成了使程序的入口点的工作。