Как работают Java-программы без определения основного метода? - PullRequest
10 голосов
/ 29 сентября 2011

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

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

Ответы [ 12 ]

18 голосов
/ 29 сентября 2011

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

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

javac MyClass1.java MyClass2.java

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

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

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

4 голосов
/ 29 сентября 2011

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

Действительно, если вы создаете веб-приложение в каком-то стандартном контейнере, ваш код, вероятно, не будет иметь метода main. Контейнер делает, но вы просто пишете компоненты, которые подключаются.

3 голосов
/ 02 апреля 2013

// работает только на Java 1.6 или менее версиях

public class Test{   
    // this is static block

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

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

  1. все статические элементы идентифицированы.
  2. все переменные и методы инициализированы
  3. выполняется статический блок
1 голос
/ 29 сентября 2011

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

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

0 голосов
/ 05 января 2018

Будет выполнено без ошибок и без метода main ()

abstract class hello extends javafx.application.Application
{
    static 
    {
    System.out.println("without main method");
    System.exit(0);
    }
}
0 голосов
/ 24 апреля 2016

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

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, который все еще не работает

0 голосов
/ 13 мая 2015

Одним из способов является статический блок, но в предыдущей версии JDK нет в JDK 1.7.

class A3{  
  static{  
  System.out.println("static block is invoked");  
  System.exit(0);  
  }  
}  
0 голосов
/ 26 декабря 2014
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
0 голосов
/ 01 июля 2014

Мы можем скомпилировать программу без основного метода.На самом деле запуск программы отличается от ее компиляции. Большинство библиотек не содержат основного метода.поэтому для компиляции не возникает проблем, содержит ли программа основной метод или нет.

0 голосов
/ 13 сентября 2013
public class Test{   
    // this is static block

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

Это будет нормально работать в JDK версии 1.6 или более ранней.В версии 1.7 и выше необходимо включить функцию main().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...