入口点进入一个程序在java通常像这样的东西


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

然而,由于只有一个SOP在主,上述类可以这样而不是


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

一个明显的优势,使用的主要(...),论点可以通过的程序。另一个(我猜这里)可能需要做的垃圾收集器治疗的对象内创建一个静态块不同。

什么其他好处来自使用语的定义入境点的公共则(String args[]),而不是使用一个静态的初始化程序。

p.s.上述段仅用于说明,可能不可编译

有帮助吗?

解决方案

  • 你可以测试它,或从其他应用程序。
  • 这是什么其他的人会期望的。
  • 如果你执行你的整个应用上下文中的一种静态的初,我 嫌疑人 你将有效地锁定这种类型的整个时间。如果任何其他线试图呼叫一个静态的方法,在同一类别,它将块。这种问题你当你试图用一个概念,在一个意想不到的方式-这只是概念上的"错误的"。初始化类根本不同运行程序。

编辑:这里有一个例子,这一问题:

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 从新线有等到静态的初始化程序完成之前,它得到运行。

其他提示

您可以在您的代码,只要你想调用其他对象main()从其他地方多次。静态初始化只会永远运行一次。此外,您还可以通过命令行参数为main()

两个大加分在我的书main()

主要原因,它为什么更好的使用 main() 是的,你可以有几种主要方法,在应用程序(在不同类)。如果你载一类, main() 不是自动执行的同时 static 代码块总是执行一次在第一时间一级的装载和没有办法阻止。

OK,我承认,我没有用静态初始化类试了一下,但不会打字

java StaticInitializedClass

在命令行上打印出

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

,因为它不具有main(String[])方法?

让我们不要忘了可维护性。当别人去改变你的代码,他们总是要寻找一个main()方法来启动程序。除非有某种原因,你不能得到解决(我猜没有),那么我只是将使用的主要方法。

如果你没有任何入境点,你不能运行任何东西。如果你有许多切入点(许多主要方法),用户开始你的应用程序的控制,这将由运行命令行。
另一方面静态的初始化块时执行类装载。控制这类装和秩序的类装卸(及执行它们的静初始化块)是更难控制。这就是足够的原因,不要把太多的逻辑静初始化块。你做出的东西更难于阅读和理解和奖励,你收到的东西更难以使用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top