gpt4 book ai didi

java - 与使用静态初始化器作为伪入口点相比,main(...) 有什么好处?

转载 作者:行者123 更新时间:2023-12-02 05:32:21 24 4
gpt4 key购买 nike

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(...) 的一个明显优势是可以将参数传递给程序。另一个(我在这里猜测)可能与垃圾收集器以不同方式处理在静态 block 中创建的对象有关。

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

附注以上片段仅供引用,可能无法编译

最佳答案

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

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

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 必须等到静态初始化器完成后才能运行。

关于java - 与使用静态初始化器作为伪入口点相比,main(...) 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1298342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com