Подтвердить что ты не робот

Почему основному методу в Java всегда нужны аргументы?

Почему основной метод в Java всегда нуждается в аргументах? Почему мы должны писать String[] args каждый раз, а не просто писать, когда мы используем какие-либо аргументы?

Подобный метод генерирует ошибку компилятора Main method not found. Поскольку мы никогда не используем никаких аргументов для основного метода, это должно быть разрешено.

public static void main()
{
}

Это не вопрос интервью. Это пришло мне в голову во время программирования.

4b9b3361

Ответ 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-программы, он ищет основной метод, имеющий эту подпись (т.е. массив строк)

Ответ 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.