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

13

Недавно я спросил на экзамене, был ли исправлен формат public static void main(String arg[]) метода main? Можем ли мы изменить его? Можем ли мы использовать main без каких-либо public, static или void? Если нет, то почему это не жестко закодировано, что main(String arg[]) всегда будет стоять за public static void main(String arg[])?

Теги:

9 ответов

21
Лучший ответ

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

Основной метод должен быть объявлен public, static и void. Это должно укажите формальный параметр (§8.4.1), объявленный тип которого является массивом Строка.

  • он должен быть public, иначе было бы невозможно назвать его
  • он должен быть static, так как у вас нет способа создать экземпляр объекта перед его вызовом
  • список аргументов String позволяет передавать параметры при выполнении программы Java из командной строки. Было бы возможно определить его без аргументов, но более практично (и аналогично другим языкам)
  • тип возврата void, поскольку нет смысла иметь что-либо еще: программа Java может завершиться до достижения основного метода (например, путем вызова 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

также справедливо

  • 0
    Вы можете легко создать новый модуль запуска, который будет делать это по-другому, метод не должен быть общедоступным (интерфейс JNI позволяет вызывать любой метод), и он не должен быть статичным, интерфейс JNI снова Можно создать любой объект , вызвав его конструктор, а затем вызвать метод экземпляра.
  • 3
    @MaurícioLinhares MaurícioLinhares Я прекрасно знаю, что могу звонить как угодно, но нет никаких гарантий, что это сработает. JVM (есть и другие JVM, также не из Oracle) только вынуждены следовать спецификациям. Они могут просто сгенерировать ошибку и сказать вам «никоим образом, не стандартно, даже если это технически возможно». Спецификация называется спецификацией по причине.
Показать ещё 9 комментариев
2

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

/* Get the application 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;
...

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

  • 3
    Я согласен, но код JDK не является верной ссылкой. Спецификации языка
  • 1
    Реализация спецификации не является правильной ссылкой? Этот взорвал меня.
Показать ещё 1 комментарий
1

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

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

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

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

0
             Public static void main(String [] ar)

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

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

return type methodName

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

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

datatype [] arrayName

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

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

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

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

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

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

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

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

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

Итак, после String [] мы можем указать имя как любой действительный java-идентификатор, он может быть "ar" или может быть "args".

0

Если нет, то почему это не жестко закодировано, что main (String arg []) будет стоять для public static void main (String arg []) всегда?

У вас могут быть методы под названием "main" с любой подписью и доступ к вам. Специальные правила применяются только к методу, который 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
0

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

  • 0
    так что мы можем иметь тип возврата не void? Я новичок в Java
  • 0
    @amar нет, он должен быть недействительным, так как он определен так в спецификации языка
0

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

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

Это сообщение дает хороший ответ, почему main недействителен: Почему main() в java void?

-1

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

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

Вот пример в коде, который был взят из this page.

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

  • 0
    Вы уверены? Мой исходный код горячей точки имеет жестко (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V"); код: (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V");
  • 0
    Нет, он определен в спецификациях языка, и он гарантированно будет работать, только если реализован так, как определено. Все, что не соответствует спецификациям, не гарантируется. docs.oracle.com/javase/specs/jls/se7/html/...
Показать ещё 6 комментариев
-2
  • Метод public-main() должен использоваться любым внешним классом, а также внутри класса, поэтому его общедоступный

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

  • void-for main() не может возвращать любое значение типа int или char main() - main - это функция или метод, которые мы можем использовать для доступа к будущему java String-in java все, что мы пишем, рассматриваем как строку Args-аргументы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню