Неинициализированные переменные и участники в Java

Другим более простым подходом является создание массива из 100 элементов с восходящими числами и сортировка его случайным образом. Это приводит к действительно короткому и, по моему мнению, простейшему фрагменту.

function randomNumbers() {
  const numbers = [ ...Array(100).keys() ].map(num => num + 1);
  numbers.sort(() => Math.random() - 0.5);
  return numbers.slice(0, 8);
}
28
задан Yuval Adam 18 December 2008 в 09:25
поделиться

5 ответов

Правила для определенного присвоения являются довольно трудными (глава 16 чтения 3-го Ed JLS). Это не практично для осуществления определенного присвоения на полях. В настоящий момент даже возможно наблюдать заключительные поля, прежде чем они будут инициализированы.

13
ответ дан Tom Hawtin - tackline 14 October 2019 в 09:40
поделиться

Вот соглашение. Когда Вы звоните

TestClass tc = new TestClass();

эти new, команда выполняет четыре важных задачи:

  1. Выделяет память на "куче" для нового объекта.
  2. Посвященные поля класса к их значениям по умолчанию (численные данные к 0, булевская переменная к false, объекты к null).
  3. Вызовы конструктор (который может повторно инициировать поля или не может).
  4. Возвраты ссылка на новый объект.

, Таким образом, Ваши поля и 'b' и инициируются к null, и переинициированного в конструкторе. Этот процесс не важен для вызова метода, таким образом, локальная переменная 'c' никогда инициализирована.

HTH

пз: для серьезно страдающего бессонницей, читайте это .

23
ответ дан stillanoob 14 October 2019 в 09:40
поделиться

Язык определяет его этот путь.

Переменные экземпляра значения по умолчанию типа объекта к тому, чтобы быть инициализированным к пустому указателю. Локальные переменные типа объекта не инициализируются по умолчанию, и это - ошибка времени компиляции для доступа к неопределенной переменной.

раздел See 4.5.5 в здесь http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5

44
ответ дан try-catch-finally 14 October 2019 в 09:40
поделиться

Компилятор может выяснить, что c никогда не будет устанавливаться. B переменная могла быть установлена кем-то еще после того, как конструктора вызывают, но прежде doSomething (). Сделайте b частный, и компилятор может быть в состоянии помочь.

3
ответ дан user35094 14 October 2019 в 09:40
поделиться

Компилятор может сказать от кода для doSomething (), что c объявляется там и никогда не инициализируется. Поскольку это локально, нет никакой возможности, что это инициализируется в другом месте.

Это не может сказать, когда или куда Вы собираетесь назвать doSomething (). b является общедоступным участником. Совершенно возможно, что Вы инициализировали бы его в другом коде прежде, чем назвать метод.

3
ответ дан Dave Costa 14 October 2019 в 09:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: