public static void main (String arg []) в Java это исправлено?

Меня недавно спросили на экзамене, еслиpublic static void main(String arg[]) форматmain метод был исправлен? Можем ли мы изменить это? Можем ли мы использоватьmain без каких-либоpublic, static или жеvoid? If not, why is it not hard coded that main(String arg[]) будет стоять заpublic static void main(String arg[]) всегда?

Ответы на вопрос(9)

Если вы посмотрите на исходный код JDK (jdk-src \ j2se \ src \ share \ bin \ java.c):

/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
                   "([Ljava/lang/String;)V");
...
{    /* Make sure the main method is public */
...
mods = (*env)->CallIntMethod(env, obj, mid);
if ((mods & 1) == 0) { /* if (!Modifier.isPublic(mods)) ... */
    message = "Main method not public.";
    messageDest = JNI_TRUE;
    goto leave;
...

Становится очень ясно, что он должен иметь только эту подпись.

 05 апр. 2012 г., 14:56
Реализация спецификации не является правильной ссылкой? Этот взорвал меня.
 05 апр. 2012 г., 14:59
нетan реализация спецификации не является справочной. Может даже ошибаться. Здесь нетthe реализация. Есть толькоan реализация.
 05 апр. 2012 г., 14:53
Я согласен, но код JDK не является верной ссылкой. Спецификации языка

If not, why is it not hard coded that main(String arg[]) would stand for public static void main(String arg[]) always?

У вас могут быть методы с именем & quot; main & quot; с любой подписью и доступ вам нравится. Специальные правила применяются только к методу, который вы хотите, чтобы JVM вызывала для запуска программы.

public class Test {
  public static void main(String[] args) {
    StrangeMain m = new StrangeMain();
    System.out.println(m.main());
    System.out.println(m.main(new String[]{"aaa","bbb"}));
  }
}

class StrangeMain{
  protected String main(){
    return "xyzzy";
  }
  protected String main(String[] arg){
    return arg[0];
  }
}

компилирует, запускает и выводит:

xyzzy
aaa

public-main() method must be used by any one of the outside the class as well as inside the class so its public

static-static is necessary bcoz in java if we define class than we define object for that class and than and only than we can use that class..but instead of this we directly use by write the word static

void-for main() cant return any value like int or char main()-main is the function or method which we can use for accessing the future of java String-in java all we write consider as a string args-arguments

Public - это своего рода спецификатор доступа, благодаря которому мы можем получить к нему доступ вне класса. Поскольку main - это функция, которая действует как точка выполнения. Функция main вызывается JVM, которая находится вне класса, поэтому она должна быть объявлена как public.

Static - это своего рода ключевое слово, используемое в Java, чтобы указать, что нет необходимости создавать его экземпляр. Как мы знаем, метод main также находится внутри класса и для доступа к определенной функции класса извне класса (в данном случае из JVM) необходим экземпляр этого конкретного класса, поэтому, чтобы избежать этого, мы просто помещаем static для создания получить доступ к основному методу вне класса.

Void - это тип возвращаемого значения, поскольку другой тип возвращаемого значения в методе main не имеет смысла.

String - это предопределенное имя класса в Java. А args [] - это переменная типов массивов. Это имя переменной объекта типа String. Таким образом, мы также можем изменить имя args []. Класс String и его объект могут быть переданы в работающей программе в качестве аргумента для передачи информации в метод main из командной строки.

Вы можете изменить его, если создадите новый загрузчик для своего приложения.public static void main( String args[] ) Формат - это просто решение по умолчанию, которое люди, работающие с JVM, могут вызывать ваши Java-программы, так что естьdefinite способ сделать это.

Реальная реализация, которую мы имеем сегодня, просто использует интерфейс JNI для вызоваpublic static void main (String args[]) метод с помощьюэта функцияТаким образом, вы можете легко написать точно такой же код, если хотите использовать JNI и использовать другой метод для загрузки своего приложения.

Вот пример в коде это было взято изэта страница.

Вот текущая программа запуска Linux,поиск метода начинается здесь.

 05 апр. 2012 г., 14:50
Конечно, проверьте исходный код программы запуска.gist.github.com/2310831#L465
 05 апр. 2012 г., 14:41
Вы уверены? В моем исходном коде горячей точки это прописано:(*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V");
 05 апр. 2012 г., 15:03
@ Maur & # xED; cioLinhares, конечно, мы говорим о спецификациях. Вопрос спрашивает о Java. Ява является точно определенным языком и этим все сказано.
 05 апр. 2012 г., 14:45
Нет, он определен в спецификациях языка, и он гарантированно будет работать, только если он реализован так, как определено. Все, что не соответствует спецификациям, не гарантируется.docs.oracle.com/javase/specs/jls/se7/html/…
 05 апр. 2012 г., 14:55
@ Маттео мыare not говоря о спецификации здесь, мы говорим о возможностиhaving a different launcher that can call a different method и вы просто повторяете, что это невозможно, пока это не так.

Я не могу отвечать за аргументы метода, но он должен быть открытым, потому что jvm должен иметь возможность доступа к функции, и он должен быть статическим, потому что jvm не знает, как создать экземпляр вашего класса.

Этот пост содержит хороший подробный ответ о причинах возникновения статики:Почему основной метод Java статичен?

Этот пост дает хороший ответ о том, почему main является недействительным:Почему main () в Java void?

             Public static void main(String [] ar)

Чтобы понять это, нам нужно знать синтаксис метода и массива.

Синтаксис метода:

возвращаемый тип methodName

поэтому основной метод пишется вместе с void, который является типом возврата.

Синтаксис массива:

тип данных [] arrayName

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

Значение слова в основном методе:

Public: Public - это спецификатор доступа, который предназначен для того, чтобы JVM могла выполнить метод main из любого места.

Статический: Статический является модификатором. Основной метод должен быть объявлен как статический, чтобы JVM могла получить доступ к основному методу напрямую, используя имя класса.

Когда мы выполняем Java-программу, мы используем имя класса, поэтому, когда мы пишем static, это поможет JVM получить доступ к основному методу.

Если мы удаляем static, то он становится методом экземпляра, чтобы получить доступ к методу экземпляра, который мы должны создать и возразить, а затем вызвать метод, используя ссылку на объект.

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

main: Main - это имя метода и оноfixed согласно соглашениям о кодировании Java.

String []: используется для хранения аргументов командной строки. Имя массива может быть любым допустимым идентификатором Java.

Таким образом, после String [] мы можем дать имя в качестве любого допустимого идентификатора Java, это может быть 'ar' apos; или это может быть «args».

Решение Вопроса

Подпись основного метода указана вРаздел Спецификаций языка Java 12.1.4 и четко заявляет:

The method main must be declared public, static, and void. It must specify a formal parameter (§8.4.1) whose declared type is array of String.

it must be public otherwise it would not be possible to call it it must be static since you have no way to instantiate an object before calling it the list of String arguments is there to allow to pass parameters when executing a Java program from the command line. It would have been possible to define it without arguments but is more practical like that (and similar to other languages) the return type is void since it does not make sense to have anything else: a Java program can terminate before reaching the end of the main method (e.g., by calling System.exit())

Поэтому подпись метода может быть:

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

обратите внимание, чтоvarargs версия (...) действует только с Java 5

Поскольку язык Java допускает скобки[] располагаться после типа или переменной (первое обычно предпочтительнее),

public static void main( String args[] ) // valid but usually non recommended

также действует

 05 апр. 2012 г., 14:53
Вы можете легко создать новый модуль запуска, который будет делать это по-другому, метод не должен быть общедоступным (интерфейс JNI позволяет вам вызыватьany метод), и он не должен быть статическим, интерфейс JNI снова может создатьany object вызывая его конструктор и затем вызывая метод экземпляра.
 05 апр. 2012 г., 14:58
there is no guarantee that it will work ? Что ты имеешь в виду? Что мой личный лаунчер не сработает, потому что в спецификации сказано иначе? Любой лаунчерwill work при условии, что запускаемый класс соответствует его критериям, пожалуйста, проверьте другие ответы и примеры исходного кода.
 05 апр. 2012 г., 15:01
Да, JVM не от Oracle (или новая версия) может просто сказать вам, что то, что вы написали, не соответствует спецификациям языка, и будет нормально
 20 мая 2013 г., 10:32
@abhi В Java вы можете расположить квадратные скобки после типа или переменной: оба допускаются (хотя первое предпочтительнее).
 05 апр. 2012 г., 14:56
@ Maur & # xED; cioLinhares Я прекрасно знаю, что могу звонить как угодно, но нет никаких гарантий, что это сработает. JVM (есть и другие JVM, также не из Oracle) только вынуждены следовать спецификациям. Они могут просто сгенерировать ошибку и сказать вам «никоим образом, не стандартно, даже если это технически возможно». Спецификация называется спецификацией по причине.

Основной метод должен бытьpublic таким образом это может быть найдено JVM, когда класс загружен. Точно так же должно бытьstatic так что он может быть вызван после загрузки класса, без необходимости создавать его экземпляр. Все методы должны иметь возвращаемый тип, который в этом случаеvoid.

 05 апр. 2012 г., 14:48
@amar нет, он должен быть недействительным, так как он определен так в спецификации языка
 amar05 апр. 2012 г., 14:35
так что мы можем иметь тип возврата не void? Я новичок в Java

Ваш ответ на вопрос