Почему основной метод Java статичен? - PullRequest
481 голосов
/ 28 сентября 2008

Подпись метода Java main () метод:

public static void main(String[] args){
    ...
}

Есть ли причина для статичности этого метода?

Ответы [ 37 ]

6 голосов
/ 29 сентября 2008

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

5 голосов
/ 29 сентября 2008

Если метод main не будет статичным, вам нужно будет создать объект вашего основного класса вне программы. Как бы вы хотели это сделать?

5 голосов
/ 21 февраля 2017

Когда вы выполняете виртуальную машину Java (JVM) с помощью команды java,

java ClassName argument1 argument2 ...

Когда вы выполняете свое приложение, вы указываете его имя класса в качестве аргумента команды java, как указано выше

JVM пытается вызвать основной метод указанного вами класса

- на данный момент объекты класса не созданы.

Объявление main как статического allows JVM для invoke main without создания instance класса.

вернемся к команде

ClassName - это command-line argument для JVM, которая сообщает ему, какой класс выполнять. Следуя ClassName, вы также можете указать list of Strings (разделенные пробелами) в качестве аргументов командной строки, которые JVM передаст вашему приложению. -Такие аргументы могут использоваться для указания параметров (например, имени файла) для запуска приложения - вот почему в главном

есть параметр с именем String[] args

Ссылки: Как программировать на Java ™ (ранние объекты), десятое издание

5 голосов
/ 28 сентября 2008

Это просто соглашение, но, вероятно, более удобное, чем альтернатива. При использовании статического main все, что вам нужно знать для вызова Java-программы, - это имя и местоположение класса. Если бы он не был статичным, вам также пришлось бы знать, как создать экземпляр этого класса, или потребовать, чтобы у класса был пустой конструктор.

3 голосов
/ 10 июля 2012

main () является статическим, потому что; в этот момент в жизненном цикле приложения стек приложения носит процедурный характер из-за отсутствия объектов, созданных еще.

Это чистый лист. На этом этапе ваше приложение работает даже без объявления каких-либо объектов (помните, что существуют процедурные и ОО-шаблоны кодирования). Вы, как разработчик, превращаете приложение в объектно-ориентированное решение, создавая экземпляры своих объектов и в зависимости от кода, скомпилированного в нем.

Объектно-ориентированный отлично подходит для миллионов очевидных причин. Однако прошли те времена, когда большинство разработчиков VB регулярно использовали в своем коде такие ключевые слова, как «goto». «goto» - это процедурная команда в VB, которая заменяется его OO-аналогом: вызов метода.

Вы также можете рассматривать статическую точку входа (основную) как чистую свободу. Если бы Java был достаточно разным, чтобы создавать экземпляр объекта и представлять вам только этот экземпляр при запуске, у вас не было бы выбора, НО написать процедурное приложение. Каким бы невообразимым это ни звучало для Java, возможно, есть много сценариев, требующих процедурных подходов.

Это, вероятно, очень неясный ответ. Помните, «класс» - это всего лишь набор взаимосвязанного кода. «Экземпляр» - это изолированное, живое и дышащее автономное поколение этого класса.

3 голосов
/ 12 июня 2012

Я думаю, что ключевое слово «static» делает метод main методом класса, а методы класса имеют только одну копию и могут использоваться всеми, а также не требуют объекта для ссылки. Поэтому, когда класс драйвера скомпилирован, основной метод может быть вызван. (Я просто на уровне алфавита Java, извините, если я не прав)

3 голосов
/ 13 июля 2012

Прототип public static void main(String[]) - это соглашение, определенное в JLS :

Метод main должен быть объявлен как public, static и void. Он должен указывать формальный параметр (§8.4.1), объявленный тип которого является массивом String.

В спецификации JVM 5.2. Запуск виртуальной машины мы можем прочитать:

Виртуальная машина Java запускается путем создания начального класса, который определяется способом, зависящим от реализации, с помощью загрузчика классов начальной загрузки (§5.3.1). Затем виртуальная машина Java связывает исходный класс, инициализирует его и вызывает метод открытого класса void main (String []) . Вызов этого метода приводит к дальнейшему выполнению. Выполнение инструкций виртуальной машины Java, составляющих основной метод, может вызвать связывание (и, следовательно, создание) дополнительных классов и интерфейсов, а также вызов дополнительных методов.

Забавно, в спецификации JVM не упоминается, что основной метод должен быть статическим. Но в спецификации также сказано, что виртуальная машина Java выполняет 2 шага раньше:

Инициализация класса или интерфейса состоит из выполнения его метода инициализации класса или интерфейса.

В 2,9. Специальные методы :

A метод инициализации класса или интерфейса определен:

Класс или интерфейс имеют не более одного метода инициализации класса или интерфейса и инициализируются (§5.5), вызывая этот метод. Метод инициализации класса или интерфейса имеет специальное имя <clinit>, не принимает аргументов и является недействительным.

И метод инициализации класса или интерфейса отличается от метода инициализации экземпляра , определенного следующим образом:

На уровне виртуальной машины Java каждый конструктор, написанный на языке программирования Java (§8.8 JLS), отображается как метод инициализации экземпляра со специальным именем <init>.

Таким образом, JVM инициализирует класс или метод инициализации интерфейса , а не метод инициализации экземпляра , который на самом деле является конструктором. Поэтому им не нужно упоминать, что метод main должен быть статическим в спецификации JVM, поскольку это подразумевается тем фактом, что ни один экземпляр не создается до вызова метода main.

3 голосов
/ 25 июля 2012

Недавно аналогичный вопрос был опубликован на Programmers.SE

  • Почему статический метод main в Java и C #, а не конструктор?

    В поисках окончательного ответа из первичного или вторичного источника, почему (в частности) Java и C # решили использовать статический метод в качестве точки входа, а не представлять экземпляр приложения экземпляром класса Application, с точкой входа, являющейся подходящим конструктором?

TL; DR часть принятого ответа:

В Java причина public static void main(String[] args) в том, что

  1. Гослинг Разыскивается
  2. код, написанный кем-то опытным в C (не в Java)
  3. для выполнения кем-то, кто привык запускать PostScript на NeWS

http://i.stack.imgur.com/qcmzP.png


Для C # аргументация транзитивно аналогична, так сказать, . Разработчики языка сохранили синтаксис для точки входа в программу, знакомый программистам, работающим на Java. Как говорит C # architect Андерс Хейлсберг ,

... наш подход к C # просто предлагал альтернативу ... программистам на Java ...

...

2 голосов
/ 29 сентября 2008

Это просто соглашение. JVM, безусловно, может иметь дело с нестатическими основными методами, если бы это было условием. В конце концов, вы можете определить статический инициализатор для вашего класса и создать миллион объектов перед тем, как перейти к методу main ().

2 голосов
/ 30 апреля 2011

Ключевое слово public является модификатором доступа, который позволяет программисту контролировать видимость членов класса. Когда члену класса предшествует public, тогда это член может быть доступен с помощью кода вне класса, в котором он объявлен.

Противоположностью public является private, что предотвращает использование элемента кодом, определенным вне его класса.

В этом случае main() должен быть объявлен как public, так как он должен быть вызван при запуске программы кодом вне его класса.

Ключевое слово static позволяет main() для вызова без создания экземпляра определенного экземпляра класса. Это необходимо, поскольку main() вызывается интерпретатором Java перед созданием каких-либо объектов.

Ключевое слово void просто сообщает компилятору, что main() не возвращает значение.

...