为什么可以在自己的类的main方法中创建对象?

时间:2014-01-21 10:50:41

标签: java

我们知道除非定义类,否则我们不能创建任何类的obj   完成了。那么我们如何才能在自己的类的main方法中创建obj?

class Test
{
    public static void main(String args[])
    {
        Test test=new Test();  //yet class definition of Test class is not completed still it is permitted! why?
    }
}

4 个答案:

答案 0 :(得分:14)

公平地说,“我们知道除非类的定义完整,否则我们不能创建任何类的obj。”是真的,但编译

Test test=new Test();

没有创建新对象,它说应该在运行时创建一个新对象。

首先编译类(不执行任何内部语句),然后运行它,此时你使用编译的类来实例化(创建)一个新对象。

事实上,您可以在自己的类的任何方法中创建一个对象(无论是静态还是实例)。

你应该注意的唯一问题是在自己的构造函数中创建一个Test对象。这将以StackOverflowError结束,因为您将无休止地以递归方式调用构造函数。

答案 1 :(得分:2)

Java代码在读取时不会执行,而是“编译”,因此在执行之前会看到整个文件。 Java编译器对输入执行多次传递,这就是为什么函数可以调用在同一文件中定义的另一个函数的原因(例如,在C和C ++编程语言中,有必要在编写任何实例化或引用该函数或类型的代码之前,为函数或类型提供声明。

答案 2 :(得分:0)

你怎么决定定义不完整?

记住 main 方法也是该类的一部分。在上面的代码中,您还可以使用该类的对象调用main方法。

class Test
{
  public static void main(String args[])
  {
    // whatever code you want     
  }
}
class Test2
{
  public static void main(String args[])
  {
    // you can call the main method of the Test class
    Test obj = new Test();
      obj.main(args);
    /*
     *  see when you can call the main method of Test class in class Test2 because
     *  compiler will treat the **main** as a static method thats it.
     */
  }
}

编译器会将 main 视为静态方法。所以当你尝试在main方法中再次创建self类的对象时,编译器会将main方法视为静态方法(意思是定义它不是空白类)所以编译器将允许你创建对象自我类没有任何错误。

答案 3 :(得分:0)

在对象实例化之前,Class会完全加载到JVM的Class-Repository。

静态方法不需要类的实例(只要它不是内部类)。