Как программы Java работают без определения основного метода?

Я просматривал исходный код Java и заметил, что main метод не определен.

как Java компилирует исходный код, не зная, с чего начать?

12 ответов


на main способ используется только тогда, когда виртуальная машина Java выполняет ваш код. Код не может быть выполнен без main метод, но он все еще может быть скомпилирован.

при компиляции кода Вы обычно указываете набор файлов в командной строке, например

javac MyClass1.java MyClass2.java

компилятор Java (javac) проверяет каждый класс, который вы передали ему, и компилирует его в a .файл класса.

одна из причин, по которой исходный код Java может отсутствовать main метод, потому что он предназначен для использования в качестве библиотеки, а не для выполнения.

что-то покажется интересным: хотя исходный код, скомпилированный компилятором Java не нужен main методом исходный код для самого компилятора Java есть main метод.


есть разница между запуском и компиляцией. Код Java может компилироваться постепенно. Вам нужно только main куда-то выполнить код. Java "знает, с чего начать", потому что компилятор достаточно умен, чтобы организовать все зависимости при компиляции.

в самом деле, если вы создаете веб-приложение в каком-то стандартном контейнере, ваш код, вероятно, не было!--0--> метод. Контейнер делает, но вы просто пишете компоненты, которые подключаются в.


// работает только на java 1.6 или меньше версии

public class Test{   
    // this is static block

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

в Java (во время работы):

  1. идентифицируются все статические члены.
  2. все переменные и методы инициализируются
  3. статический блок выполняется

как Java compile Запустите свой источник, не зная, где начать?

Я предполагаю, что вы имели в виду run (вместо compile), так как вам не нужен main() для компиляции. В этом случае явно объявленный метод main() является только одним из способов запуска программы. Для выполнения кода можно использовать некоторые фреймворки. Они получили main () (говоря только о консольных приложениях) и требуют, чтобы вы объявили только точку входа. Вот как ты ... например, запустить модульные тесты.


каждый класс Java, который вы пишете, не предназначен для точки входа для запуска, вот почему. Я бы сказал, что это скорее правило, чем исключение.


Да, мы можем запустить программу java без основного метода, для этого мы будем использовать статическую функцию

следующий код:

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

выводится " программа Hi look работает без метода main ()"


public class Test{   
    // this is static block

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

это будет работать нормально в JDK версии 1.6 или более ранней. В версии 1.7 и выше необходимо включить


мы можем скомпилировать программу без главного метода. На самом деле запуск программы отличается от ее компиляции.Большинство библиотек не содержат метода 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);  
  }  
}  

Если вы не хотите использовать статический блок, это можно сделать следующим образом

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, который, как говорят, поддерживается в Java 8. Я пробовал с JDK 1.8.0_77-b03, который все еще не работает


Это будет выполняться без каких-либо ошибок и без метода main ()

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