2012-05-28 4 views
20

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

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

public static void main() 
{ 
} 

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

+0

C наследование. Вы можете использовать 'main (String ... args)', чтобы вы могли называть 'main()', но это не ваш вопрос. –

+0

Кстати, JAVA не является аббревиатурой. Они (Sun) назвали язык после кофе Java. Хотя некоторые люди модифицируют акроним на Java, например. Just Another Vague Акроним –

+0

Он скомпилирует, но даст ошибку времени выполнения. – Pooja

ответ

27

в основном, есть четыре ответа:

  1. Потому что так он был разработан. Да, я знаю, что это круговая причина. Но дело в том, что так оно и есть, и оно не изменится. Поэтому, если вы не планируете разрабатывать свой собственный язык, вопрос спорный.

  2. Чистота дизайна (он же принцип СУХОЙ). Не указывайте две подписи точки входа, когда вы можете выполнить задание. И это ясно.

  3. Семантическая простота. Предположим (гипотетически), что Java сделал поддержка void main(String[]) и void main() точки входа. Что произойдет, если класс определит оба метода? Это ошибка? Если нет, то какой из них имеет преимущество, когда есть двусмысленность? Это еще не все?

    Только разрешите void main(String[]), JLS избегает проблемы.

  4. Это аналогично стандартным сигнатурам входа C и C++. (Правда, некоторые C/C++ среды выполнения поддерживают другие нестандартные точки входа, а также ..., но это не совсем хорошо ... ИМО.)

Все это не означает, что он был бы однозначно неправильно сделать это по-другому. И, например, C# дает альтернативные подписи и рассматривает проблему двусмысленности, требуя от разработчика указать точку входа другим способом.

FWIW, this wikipedia page описывает «основной» метод на нескольких языках.

+0

Вот и все, я устал от Java! Imma разрабатывает собственный язык с поддержкой 'main()'. – NoName

5

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

Подробнее вы можете найти в Спецификации Java Language, Chapter 12: Execution. И обратите внимание, что, когда Java есть переменные списки аргументов, это стало возможным объявить main два различных способов:

public static void main(String[] args) 
// or 
public static void main(String... args) 
+0

Да, но почему главный метод без каких-либо аргументов не допускается. В C или C++ мы можем или не можем включать аргументы в основной метод. Но почему не в JAVA – dejavu

+0

@AndroidDecoded: поскольку Java имеет перегрузку метода, а инструмент 'java' выглядит специально для' main', определенного JLS. Я немного расширил ответ. –

0

В JVM начинает выполнение программы Java он ищет основной метод, имеющие эту подпись (т.е. массив строка)

-1

Когда вы пытаетесь запустить java-программу, JVM будет искать основной метод с Строковый массив как аргумент, чтобы начать выполнение программы оттуда. Как метод вы получаете не с этой подписью, поэтому он сгенерирует исключение Нет основной метода не найден

-1

Я думаю, что Java «скопировал» эту привычку от C/C++, и жестко закодированы в java.c:

/* Get the application's 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; 
    } 
0

Это именно то, как они его проектировали. Следствием этого, вы можете спросить, почему его кузен (C#) позволяет Main метод с параметрами или без них, это именно то, как они его разрабатывали.

Там нет серьезного обоснования, у каждого языкового дизайнера есть свои предпочтения, на каких принципах вы должны подписаться. Иногда нам приходится делать выводы или придерживаться (иногда мы не можем добиться чего-то в этом роде).

Хм ... это напоминает мне ОС, которые я использую сейчас. До OS X Lion вы можете изменять размер только в правом нижнем углу окна. Это 28 + лет ожидания, прежде чем они, наконец, добавят возможность изменять размер в любом уголке окна на своей ОС.

Даже я очень люблю Mac OS, я бы не стал защищать свою позицию, прежде чем окно должно быть изменено только на одном углу. Ревность - это одно, а слепое следование - другое.

Так что это хорошо, что вы практикуете критическое мышление, а не слепо верить, что основной метод подписи Java является единственно правильный путь


отступлением, ожидая Mac иметь изменяемый размер края на любой угол сродни мне, ожидая, что Java будет иметь первоклассное свойство. Несмотря на название JSON ( Java Обозначение объекта сценария, хотя, конечно, Javascript не является Java), инициализатор объектов C# (через его инициализатор свойств и инициализатор коллекции) имеет больше сходства с JSON по сравнению с инициализатором объектов Java с JSON. Инициализатор объектов C# очень опрятен и очень похож на JSON.

C#

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" } 
     ] 
}; 

Следовательно, с первым классом собственностью С # (не втиснуть методу) и сбор инициализатором, а не только код становится кратким и аккуратно, теперь близко напоминают то, что большинство разработчиков используют сейчас для формата обмена данными, то есть JSON.

Синтаксис инициализатора объекта Java далек от стиля JSON. Я не буду защищать конструкторское решение Java (например, синтаксис/дизайн свойства) в этом отношении :-)

Таким образом, в том же духе, что я не буду защищать дизайнерское решение дизайнерского языка Java по синтаксису/дизайну синтаксиса Java, я буду не защищают public static void main(String[] args)

+0

Да, но JAVA также должен допускать такой основной метод. Поскольку я не знаю C#, я не могу ссылаться на этот пример. – dejavu

+0

@AndroidDecoded Пример можно попробовать на http://ideone.com C# без аргумента: http://ideone.com/rS1pk C# с аргументом: http://ideone.com/3lQjd –

+0

Как и вы, я считаю, что нет причина, почему main-less main method не должен быть разрешен в Java. Это может быть разрешено, просто посмотрите на другие языки. Мы не должны смотреть на некоторые вещи технически, иногда мы должны смотреть на их основные принципы. –

-1

java спроектирован таким образом. если мы не будем писать строки args [], тогда программа будет скомпилирована , но она не будет запущена.

-1

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

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