Почему основному методу в Java всегда нужны аргументы?
Почему основной метод в Java всегда нуждается в аргументах? Почему мы должны писать String[] args
каждый раз, а не просто писать, когда мы используем какие-либо аргументы?
Подобный метод генерирует ошибку компилятора Main method not found
. Поскольку мы никогда не используем никаких аргументов для основного метода, это должно быть разрешено.
public static void main()
{
}
Это не вопрос интервью. Это пришло мне в голову во время программирования.
Ответы
Ответ 1
В принципе, есть четыре ответа:
-
Потому что так оно и было спроектировано. Да, я знаю, что это круговая причина. Но дело в том, что так оно и есть, и оно не изменится. Поэтому, если вы не планируете создавать свой собственный язык, вопрос спорный.
-
Чистота дизайна (также известный как DRY). Не указывайте две подписи точки входа, когда вы можете выполнить задание. И это ясно.
-
Семантическая простота. Предположим (гипотетически), что Java поддерживала точки входа void main(String[])
и void main()
. Что произойдет, если класс определит оба метода? Это ошибка? Если нет, то какой из них имеет преимущество, когда есть двусмысленность? Это еще что-то запутывает?
Только разрешить void main(String[])
, JLS избегает проблемы.
-
Это аналогично стандартным сигнатурам входа C и С++. (По общему признанию, некоторые временные среды C/С++ поддерживают и другие нестандартные точки входа... но это не совсем то, что нужно... IMO.)
Ничто из этого не означает, что было бы недвусмысленно неправильно делать это по-другому. И, например, С# дает альтернативные подписи и рассматривает проблему двусмысленности, требуя от разработчика указать точку входа другим способом.
FWIW, эта страница wikipedia описывает "основной" метод на нескольких языках.
Ответ 2
Поскольку инструмент java
, который запускает приложение, ищет main
с определенной сигнатурой, поэтому он знает, что он вызывает правильный. У Java есть перегрузка метода, поэтому при поиске метода вы должны указать довольно полную подпись. Предоставленный инструмент java
мог бы сделать что-то более сложное (искать конкретную подпись и, не найдя ее, искать любой main
и вызывать ее, если она ее только найдет), но это не то, что решили разработчики Java (и субъективно, FWIW, я думаю, что для лучших — держите его просто).
Вы можете найти подробности в Спецификации языка Java, Глава 12: Выполнение. Обратите внимание, что с того момента, когда Java получила списки переменных аргументов, стало возможно объявить main
двумя разными способами:
public static void main(String[] args)
// or
public static void main(String... args)
Ответ 3
Когда JVM начинает выполнение java-программы, он ищет основной метод, имеющий эту подпись (т.е. массив строк)
Ответ 4
Это из-за спецификации
аргументы полезны для передачи параметров в основную программу
См
Ответ 5
Это именно то, как они его разработали. Вследствие этого вы можете спросить, почему его кузен (С#) позволяет Main-метод с параметрами или без него, так же, как они его разрабатывали.
Там нет серьезного обоснования, у каждого дизайнера языка есть свои предпочтения, на каких принципах вы должны подписаться. Иногда нам нужно делать вывод, или придерживаться (иногда мы не можем получить что-то в этом роде) тем временем.
Хм... это напоминает мне ОС, которые я сейчас использую. До OS X Lion вы можете изменять размер только в правом нижнем углу окна. Это еще 28 лет ожидания, прежде чем они, наконец, добавят возможность изменять размер в любом уголке окна на своей ОС.
Даже мне очень нравится Mac OS, я бы не стал защищать свою позицию, прежде чем окно должно быть изменено только на одном углу. Зилотство - это одно, но слепое следование - это другое.
Итак, хорошо, что вы практикуете критическое мышление и не слепо верите, что подпись основного метода Java единственный правильный путь
<ч/" > Отступление, ожидающее, что Mac будет иметь изменяемые края в любом углу, сродни мне, ожидая, что Java получит первоклассное свойство. Несмотря на название JSON ( Java Script Обозначение объекта, хотя, конечно, Javascript не является Java), инициализатор объектов С# (через его инициализатор свойств и инициализатор коллекции) имеет большее сходство с JSON по сравнению с объектом Java инициализатор с JSON. Инициализатор объектов С# очень опрятен и очень похож на JSON.
С#
var p = new {
Lastname = "Lennon",
Firstname = "John",
PlacesBeen =
new[]
{
new { City = "Liverpool", Country = "England" },
new { City = "New York", Country = "US" },
new { City = "Tokyo", Country = "Japan" }
}
};
return Json(p);
JavaScript:
var p = {
"Lastname" : "Lennon",
"Firstname" : "John",
"PlacesBeen" :
[
{ "City" : "Liverpool", "Country" : "England" },
{ "City" : "New York", "Country" : "US" },
{ "City" : "Tokyo", "Country" : "Japan" }
]
};
Следовательно, с свойством первоклассного класса С# (но не методом shoehorned to method) и инициализатором коллекции не только код становится кратким и аккуратным, он теперь очень похож на то, что большинство разработчиков используют сейчас для формата обмена данными, то есть JSON.
Синтаксис инициализатора объектов Java далек от стиля JSON. В этом отношении я не буду защищать решение Java (например, синтаксис/дизайн свойства): -)
Итак, в том же духе, что я не буду защищать дизайнерское решение Java-дизайнера по синтаксису/дизайну Java-свойств, я не буду защищать public static void main(String[] args)
ツ
Ответ 6
когда вы пытаетесь запустить java-программу, JVM будет искать основной метод с String array в качестве аргумента, чтобы начать выполнение программы оттуда. Поскольку метод, которому вы даны, не с этой сигнатурой, поэтому он будет создавать исключение Основной метод не найден
Ответ 7
Я думаю, что Java "скопировала" эту привычку из c/С++ и жестко закодирована в java.c:
/* Get the application main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
"([Ljava/lang/String;)V");
if (mainID == NULL) {
if ((*env)->ExceptionOccurred(env)) {
ReportExceptionDescription(env);
} else {
message = "No main method found in specified class.";
messageDest = JNI_TRUE;
}
goto leave;
}
Ответ 8
java сконструирован таким образом. если мы не будем писать строки args [], тогда программа будет скомпилирована
но он не будет работать.
Ответ 9
его может быть так, как и большинство входов поступают извне main(), как из аргументов командной строки, поэтому, чтобы поймать эти значения, у него есть подпись String [] args.