2011-01-23 4 views
1

Я знаю, что это выглядит сумасшедшим. Но в любом случае. Мы все знаем, каким должен быть основной метод: public static void main(String args[]). ПричинаНеобходимость для «main» (java)

  • public: Метод можно получить из кода вне класса, в котором он определен (вызывается из JVM)
  • static: Метод можно получить без создания экземпляра класса, в котором она объявлена , Опять же, это ключевое слово также позволяет JVM вызывать этот метод без создания экземпляра класса.
  • void: Метод не возвращает данные.

Итак, зачем нужна «главная» здесь. Даже если есть другой метод, скажите public static void entry(String args[]), почему jvm не будет вызывать этот метод. Это дает проблемы компилятора, говорящие, что он не может найти основной метод. Даже этот public static void entry(String args[]) компилируется в вышеупомянутые 3 правила.

+5

Потому что, слишком плохо, спецификация говорит, что это должно быть «главное». – BoltClock

+5

Как JVM знает, что он должен вызывать метод 'entry'? Если вы укажете переменную имени, вы должны указать, какой метод вызывать. –

+0

«Это дает компилятору проблемы, говорящие, что он не может найти метод' main'. Вы говорите, что это было что-то плохое. –

ответ

3

Вперед. Внедрите свой собственный драйвер командной строки, который использует интерфейс вызова JNI для запуска программы в любой момент, когда обращается к вам.

Специальный символ «main» - это просто вопрос программы командной строки Java. Дизайнеры сделали выбор. Их причины не дико интересны; это не изменится. Ну, если быть точным, вы можете присоединиться к проекту openjdk и попытаться продать им функцию.

+0

FWIW - написание собственной пусковой установки с использованием JNI довольно просто ... Я бы рекомендовал это как хорошее упражнение. Также неплохо иметь свой собственный исполняемый файл, если вы развертываете приложения по-старому. –

1

Помимо причин, предоставленных другими, был/есть еще один - нетехнический, но, вероятно, более важный, чем технические соображения: - упрощение обучения Java (для программистов на С ++, в первую очередь). Назад, когда началась Java, их создатели хотели сделать ее простым языком и помочь разработчикам конвертировать из существующих языков. Поскольку основным существующим языком OO в использовании был C++ в то время, и там точка входа называется main (что действительно, как отметил @Felix, унаследованный от C, чтобы максимально упростить C++), они использовали один и тот же имя на Java тоже. Заметим, что с тех пор C# также приняла то же соглашение (хотя и в несколько более общей форме) по той же причине.

+1

И 'C++' получил его от 'C'. И 'C' получил это .... Я не знаю. –

+1

И C получил его от BCPL, а BCPL получил его от Брайана Кернингана и Денниса Ричи. –

+0

Является ли BCPL не использующим start() для этого? – Rekin

2

Метод должен быть вызван main, потому что должно быть что-то, чтобы указать, что метод является методом точки входа. Не только любой метод public static void с одним аргументом String[] следует считать точкой входа ... вам может понадобиться такой метод, который делает что-то другое. Кроме того, указывая конкретное имя, которое должен иметь метод, существует гарантия того, что один класс может иметь не более одного метода точки входа. Вы могли бы:

class Something { 
    public static void main(String[] args) { ... } 
    public static void parseArgs(String[] args) { ... } 
    public static void displayInvalidArgsMessage(String[] args) { ... } 
} 

Если вы попытаетесь запустить этот класс, как бы это выбрать метод использовать, если не было какое-то правило? Сегодня с аннотациями может потребоваться метод public static void с аргументом String[] с аннотацией @EntryPoint или некоторыми такими ... но решение main по-прежнему лучше, чем это, потому что компилятор может принудительно применять ограничение одного метода main для каждого класса, используя его нормальные правила подписи к методу, в то время как нескольким методам может быть дана одна и та же аннотация. Не говоря уже о том, что необходимо было запустить программы задолго до добавления аннотаций и прецедента из C и C++.

Смежные вопросы