这里是我的代码:为什么`main`在这里被调用两次?
public class Test
{
static
{
main(null);
}
public static void main(String [] args)
{
System.out.println("done");
}
}
我得到以下输出:
done
done
有人可以请解释我这样做的原因是什么?
这里是我的代码:为什么`main`在这里被调用两次?
public class Test
{
static
{
main(null);
}
public static void main(String [] args)
{
System.out.println("done");
}
}
我得到以下输出:
done
done
有人可以请解释我这样做的原因是什么?
您认为什么不寻常?该static
块被执行一次时,类装载(和它具有执行main
方法之前被加载然后main
方法本身执行
检查出这个修改版本:
public class Test {
static {
main(new String[]{"[done static]"});
}
public static void main(String[] args) {
System.out.println(args.length > 0 ? args[0] : "[done]");
}
}
它打印:
[done static]
[done]
我们传递null作为主要方法存在于static中的参数,它应该是字符串 – 2012-04-10 20:19:57
我只是因静态块内main方法中存在null参数而感到困惑,请告诉我会说它会产生任何问题,因为主要方法期望一个字符串类型作为参数 – 2012-04-10 20:28:10
@saurabhRai:'main'方法需要'String ** **数组**,而不是'String'。另外'null'不是很正确,因为'main'方法总是由JVM提供参数数组 - 如果没有参数,这个数组是空的,但不是'null'。 – 2012-04-10 20:30:12
的原因是main
被调用两次:
如何解决这个问题?要么不明确地调用它,要么重命名它,以便它不会被自动调用。
当第一次加载类时,会调用类的静态块。这是第一次完成。第二个是因为你正在运行程序,然后调用main方法。
无论你告诉我,我知道,但问题是,我们传递null作为静态主要方法中的参数,它应该有一些字符串 – 2012-04-10 20:17:29
由于您没有使用传递给main的参数,它并不重要,你是什么传递给主要方法。它只会被调用。 – 2012-04-10 20:25:27
谢谢,最后你提供了我正在寻找的解决方案 – 2012-04-10 20:31:53
由于
Test
在JVM(它是一种静态构造的)main
方法被称为内部加载的static { ... }
部分被调用。主要是通过在加载罐虚拟机自动调用,所以这是第一个“完成”,正常的切入点Java程序
012。第二个'完成'是因为您在静态类初始化程序中显式调用它而编写的。一旦虚拟机类加载器加载类,就会调用添加到“Test”类中的“静态”部分。
应该从静态初始化程序甚至在入口点Main被调用之前调用它,因为在调用入口点之前需要加载类。
在调用Test.main
之前,JVM需要通过运行其静态初始化程序来初始化Test
类。此电话是第一次致电main()
。初始化完成后,JVM再次调用main()
,最终生成您看到的输出。
Main由JVM自动调用。不需要在静态部分中调用它。
public class Test
{
public static void main(String [] args)
{
System.out.println("done");
}
}
上面的代码是它应该是。
请阅读[this](http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html)。 – mre 2012-04-10 20:14:41