繁体   English   中英

Java 程序如何在不定义 main 方法的情况下运行?

[英]How do Java programs run without defining the main method?

我正在查看一些 Java 源代码并注意到未定义main方法。

Java如何在不知道从哪里开始的情况下编译源代码?

main方法仅在 Java 虚拟机执行您的代码时使用。 没有main方法就不能执行代码,但它仍然可以编译。

编译代码时,通常会在命令行指定一组文件,例如

javac MyClass1.java MyClass2.java

Java 编译器 ( javac ) 检查您传递给它的每个类并将其编译为 .class 文件。

Java 源代码可能缺少main方法的一个原因是它被设计为用作库,而不是被执行。

您可能会发现有趣的事情:虽然 Java 编译器编译的源代码不需要main方法, 但 Java 编译器本身源代码确实有一个main方法。

运行和编译是有区别的。 Java 代码可以增量编译。 你只需要一个main地方来运行代码。 Java“知道从哪里开始”,因为编译器足够聪明,可以在编译时安排所有依赖项。

事实上,如果您在某种标准容器中构建 Web 应用程序,您的代码可能没有main方法。 容器可以,但您只需编写可插入的组件。

// 仅适用于java 1.6或更低版本

public class Test{   
    // this is static block

    static{
        System.out.println("This is static block");  
    }
}

在 Java 中(运行时):

  1. 标识所有静态成员。
  2. 所有变量和方法都被初始化
  3. 静态块被执行

Java compile如何在不知道从哪里开始的情况下运行您的源代码?

我假设您的意思是运行(而不是编译),因为您不需要 main() 来编译。 在这种情况下,显式声明的 main() 方法只是运行程序的方法之一。 您可以使用一些框架来执行您的代码。 他们有 main() (仅讨论控制台应用程序)并要求您仅声明一个入口点。 例如,这就是您运行单元测试的方式。

是的,我们可以在没有 main 方法的情况下运行 java 程序,为此我们将使用静态函数

以下是代码:

class Vishal
{
    static
    {
        System.out.println("Hi look program is running without main() method");
    }
}

这将输出“Hi look program is running without main() method”

public class Test{   
    // this is static block

    static{
        System.out.println("This is static block");  
        System.exit(0);
    }
}

这将在 JDK 1.6 或更早版本中正常运行。 在 1.7 及更高版本中,需要包含main()函数。

我们可以在没有 main 方法的情况下编译程序。 实际运行程序与编译程序不同。大多数库不包含 main 方法。 所以对于编译,程序是否包含 main 方法是没有问题的。

package com.test;

public class Test {
    static {
        System.out.println("HOLAAAA");
        System.exit(1);
    }
}

//by coco
//Command line:
//java -Djava.security.manager=com.test.Test

其中一种方法是静态块,但在以前的 JDK 版本中没有在 JDK 1.7 中。

class A3{  
  static{  
  System.out.println("static block is invoked");  
  System.exit(0);  
  }  
}  

这将在没有任何错误且没有 main() 方法的情况下执行

abstract class hello extends javafx.application.Application
{
    static 
    {
    System.out.println("without main method");
    System.exit(0);
    }
}

是的,我们可以在没有 Main 函数的情况下编译和执行 java 程序。 取而代之的是,我们可以使用静态块来编译和执行程序。 它仅支持以前版本的 java。 但是现在不支持了...

您编写的每个 Java 类都不打算作为运行的入口点,这就是原因。 我会说这是规则而不是例外。

如果您也不想使用静态块,可以按照以下方式完成

public class NoMain {

    private static final int STATUS = getStatus();

    private static int getStatus() {
        System.out.println("Hello World!!");
        System.exit(0);
        return 0;
    }

}

但是,请注意,这是针对 Java 6 版本的。 这似乎不适用于 Java 7 及更高版本

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM