2

java中程序的入口点通常是这样的


    // MyMain.java
    public class MyMain{  
      //whatever 
        public static void main(String args[]){ 
        System.out.println("balderdash");
        }
    }

但是,由于 main 中只有一个 SOP,所以上面的类可能是这样的


    // MyMain.java
    public class MyMain{
        //whatever
        static {    
        System.out.println("balderdash");
        }
    }

使用 main(...) 的一个明显优势是可以将参数传递给程序。另一个(我在这里猜测)可能与垃圾收集器以不同方式处理在静态块中创建的对象有关。

使用语言定义的入口点还有哪些其他好处 - public static void main( String args[] ) 而不是使用静态初始化程序。

ps 以上片段仅供参考,可能无法编译

4

6 回答 6

6
  • 您可以对其进行测试或从其他应用程序中调用它。
  • 这是其他人所期望的。
  • 如果您在静态初始化程序的上下文中执行整个应用程序,我怀疑您将有效地一直锁定该类型。如果任何其他线程试图调用同一类中的静态方法,它将阻塞。当你试图以一种意想不到的方式使用一个概念时,你就会遇到这种问题——这只是概念上的“错误”。初始化类与运行应用程序完全不同。

编辑:这是该问题的一个示例:

class SampleTask implements Runnable
{
    public void run()
    {
        System.out.println("Calling someStaticMethod");
        Test.someStaticMethod();
        System.out.println("someStaticMethod returned");
    }
}

public class Test
{
    static
    {
        System.out.println("Starting new thread...");
        new Thread(new SampleTask()).start();
        System.out.println("Thread started. Sleeping");
        try
        {
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            System.out.println("Interrupted!");
        }
        System.out.println("Finished sleeping");          
    }

    public static void someStaticMethod()
    {
        System.out.println("In someStaticMethod");
    }

    public static void main(String[] args)
    {
        System.out.println("In main. Sleeping again.");
        try
        {
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            System.out.println("Interrupted!");
        }
    }
}

输出:

Starting new thread...
Thread started. Sleeping
Calling someStaticMethod
Finished sleeping
In someStaticMethod
someStaticMethod returned
In main. Sleeping again.

注意someStaticMethod来自新线程的调用必须等到静态初始化程序完成才能运行。

于 2009-08-19T07:46:33.650 回答
5

main()您可以根据需要多次从代码中的其他任何位置调用其他对象。静态初始化程序只会运行一次。此外,您可以将参数从命令行传递到main().

main()在我的书中有两个大优点。

于 2009-08-19T07:45:35.383 回答
2

使用它的主要原因main()是您的应用程序中可以有几个主要方法(在​​不同的类中)。如果您加载一个类,main()则不会自动执行,而static代码块总是在第一次加载类时只执行一次,并且没有办法阻止这种情况。

于 2009-08-19T08:09:42.853 回答
2

好的,我承认我没有尝试过使用静态初始化类,但不会输入

java StaticInitializedClass

在命令行打印出来

Exception in thread "main" java.lang.NoSuchMethodError: main

因为它没有main(String[])方法?

于 2009-08-19T14:09:39.937 回答
1

我们不要忘记可维护性。当其他人去更改您的代码时,他们总是会寻找 main() 方法来启动程序。除非有某种原因你无法绕过(我猜没有),否则我只会使用 main 方法。

于 2009-08-19T13:59:03.213 回答
0

如果你没有任何入口点,你就不能运行任何东西。如果您有许多入口点(许多主要方法),则启动应用程序的用户将控制将由命令行运行。
另一方面,静态初始化块在加载类时执行。控制加载哪个类以及加载类的顺序(以及执行它们的静态初始化块)要控制得多。这足以有理由不为静态初始化块添加太多逻辑。你让一些东西更难阅读和理解,作为回报,你会得到一些更难使用的东西。

于 2009-08-19T14:22:18.067 回答