我们知道除非定义类,否则我们不能创建任何类的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?
}
}
答案 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。
静态方法不需要类的实例(只要它不是内部类)。