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

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

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

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

Ответы [ 37 ]

1 голос
/ 11 июля 2012

Истинной точкой входа в любое приложение является статический метод. Если бы язык Java поддерживал метод экземпляра в качестве «точки входа», то среда выполнения должна была бы реализовать его внутренне как статический метод, который создавал экземпляр объекта с последующим вызовом метода экземпляра.

После этого я рассмотрю обоснование выбора конкретного из следующих трех вариантов:

  1. A static void main() как мы видим сегодня.
  2. Метод экземпляра void main(), вызываемый для только что созданного объекта.
  3. Использование конструктора типа в качестве точки входа (например, если класс входа был назван Program, тогда выполнение фактически будет состоять из new Program()).

Разбивка:

static void main()

  1. Вызывает статический конструктор класса включения.
  2. Вызывает статический метод main().

void main()

  1. Вызывает статический конструктор окружающего класса.
  2. Создает экземпляр окружающего класса, эффективно вызывая new ClassName().
  3. Вызывает метод экземпляра main().

new ClassName()

  1. Вызывает статический конструктор класса включения.
  2. Создает экземпляр класса (затем ничего с ним не делает и просто возвращает).

Обоснование:

Я пойду в обратном порядке к этому.

Имейте в виду, что одной из целей разработки Java было подчеркнуть (требовать, когда это возможно) хорошие методы объектно-ориентированного программирования. В этом контексте конструктор объекта инициализирует объекта, но не должен отвечать за поведение объекта. Таким образом, спецификация, которая давала точку входа new ClassName(), могла бы запутать ситуацию для новых разработчиков Java, вынудив исключить конструкцию «идеального» конструктора в каждом приложении.

Сделав main() методом экземпляра, вышеуказанная проблема, безусловно, решена. Однако это усложняет задачу, требуя, чтобы спецификация перечисляла сигнатуру конструктора класса входа, а также сигнатуру метода main().

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

1 голос
/ 08 декабря 2016

static - Когда JVM выполняет вызов метода main, для вызываемого класса не существует объекта, поэтому он должен иметь статический метод, позволяющий вызывать класс.

1 голос
/ 03 июня 2015

Я не знаю, вызывает ли JVM метод main перед созданием объектов ... Но есть гораздо более веская причина, почему метод main () является статическим ... Когда JVM вызывает метод main класс (скажем, человек). он вызывает его с помощью « Person.main () ». Видите ли, JVM вызывает его по имени класса. Вот почему метод main () должен быть статическим и общедоступным, чтобы JVM мог получить к нему доступ.

Надеюсь, это помогло. Если это так, дайте мне знать, комментируя.

0 голосов
/ 12 марта 2010

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

0 голосов
/ 18 августа 2016

Основной метод программы имеет зарезервированное слово static , что означает, что его можно использовать в статическом контексте. Контекст относится к использованию компьютерной памяти во время работы программы. Когда виртуальная машина загружает программу, она создает для нее статический контекст, выделяя память компьютера для хранения программы и ее данных и т. Д. A динамический контекст - это определенный вид выделения памяти, которая создается позже, во время работы программы. Программа не сможет запуститься, если основной метод не может быть запущен в статическом контексте.

0 голосов
/ 29 апреля 2016

Существует простая причина этого в том, что объект не требуется вызывать статический метод. Если это был нестатический метод, виртуальная машина Java сначала создает объект, а затем вызывает метод main (), что приведет к проблеме дополнительных распределение памяти.

0 голосов
/ 10 июля 2015

В основном мы делаем те ЧЛЕНЫ ДАННЫХ и ФУНКЦИИ ЧЛЕНА СТАТИЧЕСКИМИ, которые не выполняют никаких задач, связанных с объектом. А в случае метода main мы делаем его как STATIC, поскольку он не имеет ничего общего с объектом, так как метод main всегда запускается независимо от того, создаем мы объект или нет.

0 голосов
/ 12 января 2009

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

0 голосов
/ 05 ноября 2009

static указывает на то, что этот метод является классом method.and вызван без требования какого-либо объекта класса.

0 голосов
/ 23 января 2015

Любой метод, объявленный как статический в Java, принадлежит самому классу. Снова к статическому методу определенного класса можно получить доступ, только обратившись к классу, подобному Class_name.method_name();

Таким образом, нет необходимости создавать экземпляр класса перед доступом к статическому методу.

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

Поскольку мы сохраняем программу с именем класса, в котором присутствует метод main (или откуда программа должна начать свое выполнение, применимо для классов без main() method () (Advanced Level)). Итак, вышеупомянутым способом:

Class_name.method_name();

доступ к основному методу.

Вкратце, когда программа компилируется, она ищет метод main(), имеющий String аргументы, такие как: main(String args[]) в упомянутом классе (то есть по имени программы), и так как в начале она нет возможности создать экземпляр этого класса, поэтому метод main () объявлен как статический.

...