Являются ли args [0], args [1] переменными? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть такой код:

public class Hi
{
  public static void main(String args[])
  {
    ...
  }
}

Если я наберу следующий комментарий «java Hi String1 String2», сколько объектов.

Правильный ответ:

Объекты: 3: объект "String1", объект "String2", точка массива по аргументам.

Переменные: 4: args, "String1", "String2", точка массива по аргументам.

И мой вопрос:

Могу ли я считать "String1" и "String2" в переменной count как args [0] и args [1]? (Это означает, что args [0] и args [1] являются переменными.)

Если код

int a[2]={0};

Я знаю, что есть 1 объект массива и 2 переменные (a, объект массива), но поскольку String в Java является особенным, мне интересно, должен ли я взять «String1» и «String2», или я могу взять args [0] и args [1] как переменные следующим образом?

Объекты: 3: объект "String1", объект "String2", точка массива по аргументам.

Переменные: 4: args, args [0], args [1], точка массива по аргументам.

1 Ответ

0 голосов
/ 03 июня 2019

TL; DR Краткий ответ: Да, args[0] и args[1] являются переменными.


Согласно JLS 4.12.3.Виды переменных , существует 8 видов переменных.Из них ваш код использует 3 из них:

переменная экземпляра - это поле, объявленное в объявлении класса без использования ключевого слова static ( §8.3.1.1 ).

Еслиу класса T есть поле a, которое является переменной экземпляра, затем создается новая переменная экземпляра a и инициализируется значением по умолчанию ( §4.12.5 ) как часть каждого вновь созданного объекта класса T илилюбого класса, который является подклассом T ( §8.1.4 ).Переменная экземпляра фактически перестает существовать, когда на объект, к которому она относится, больше нет ссылок после того, как завершена необходимая финализация объекта ( §12.6 ).

Компоненты массива - это неназванные переменные, которые создаются и инициализируются значениями по умолчанию ( §4.12.5 ) всякий раз, когда создается новый объект, являющийся массивом ( §10 (массивы) , §15.10.2 ).Компоненты массива фактически перестают существовать, когда на массив больше нет ссылок.

Параметры метода ( §8.4.1 ) name Значения аргументапередается методу.

Для каждого параметра, объявленного в объявлении метода, при каждом вызове метода создается новая переменная параметра ( §15.12 ).Новая переменная инициализируется соответствующим значением аргумента из вызова метода.Параметр метода фактически перестает существовать, когда выполнение тела метода завершено.


Когда вы запускаете java Hi String1 String2, вы получаете:

  • 3 объекта:

    • String[2] (массив)
    • "String1" (строка)
    • "String2" (строка)
  • 4 переменных 1 :

    • args (параметр метода)
    • args.length (переменная экземпляра)
    • args[0] (компонент массива)
    • args[1] (компонент массива)

Обратите внимание, что если вы создаете String[2] и неЕсли вы присваиваете значения компонентам массива (т.е. оставляете их null), у вас будет только 1 объект, но у вас все равно будет 4 переменные.

1) Не считая privateполя (переменные экземпляра) внутри объектов String.


int a[2]={0}; является недопустимым кодом и не сможет скомпилироваться.

Когда выЕсли вы используете инициализатор, вы не можете указать размер массива, так как он неявен в инициализаторе.

Кроме того, вы всегда должны объявлять массив [] как часть типа, а не как часть имени.Указание [] с именем является чем-то, унаследованным от языка C, и крайне нежелательно.

Правильное объявление:

int[] a = { 0 };

Что:

  • 1 объект:

    • int[1] (массив)
  • 3 переменных:

    • a (локальная переменная, вид # 8)
    • a.length (переменная экземпляра)
    • a[0] (компонент массива)
...