Я задал этот вопрос более 3 лет назад, и, очевидно, ответы менялись с годами. Как уже было сказано выше, как и когда-то назад, ответ стал Да. Я никогда не обновлял принятый ответ, потому что это был правильный ответ в то время. (Я не уверен, что такое политика переполнения стека)
Я просто хотел добавить еще один ответ тем, кто все еще ищет эту тему. По состоянию на 17.05.2010 Google также объявил, что Kotlin также является официальным языком для разработки Android.
Я не нашел официального пресс-релиза, но я смотрел некоторые из них видео Google I / O , где было объявлено. Вот ссылка на запись в блоге post командой Kotlin по объявлению.
Был вопрос об этом совсем недавно для C # ... - читайте ответы там также, так как это в основном то же самое. Вы также можете найти последнее сообщение в блоге Эрика Липперта ; это, по крайней мере, около одной и той же области, хотя и имеет несколько другую направленность.
В принципе, для того, чтобы переменной присваивалось значение, прежде чем вы прочитаете, это хорошая вещь. Это означает, что вы случайно не прочитаете то, чего не хотели. Да, переменные могут иметь значения по умолчанию - но не лучше ли, чтобы компилятор смог поймать вашу ошибку, если это может доказать, что вы пытаетесь прочитать что-то, что еще не было назначено? Если вы хотите присвоить локальную переменную значение по умолчанию, вы всегда можете назначить это явно.
Теперь это нормально для локальных переменных, но, например, для статических переменных и переменных, компилятор не имеет способа узнать порядок в какие методы будут называться. Будет ли вызвано свойство «сеттер» перед «геттером»? Он не может знать, поэтому он не может предупредить вас об опасности. Вот почему значения по умолчанию - это , используемые для экземпляра / статические переменные - по крайней мере, тогда вы получите известное значение (0, false, null и т. Д.), А не просто «все, что было в памяти в то время «. (Он также устраняет потенциальную проблему безопасности чтения конфиденциальных данных, которые не были явно стерты.)
На практике все переменные должны быть инициализированы перед их использованием.
Я не могу думать о времени, когда вы захотите использовать переменную перед установкой ее значения (если вы не сравниваете ее с нуль).
Локальные переменные и примитивы должны быть инициализированы перед использованием, потому что вы знаете, чего ожидать от значений. Исторически, когда была создана новая переменная, она содержала бы случайные значения из памяти [и невозможно предсказать значение]. Java также требует этого, потому что он предотвращает наличие потерянных переменных.
Ну, в случае локальной переменной ясно, что означает «раньше», поскольку поток программы между объявлением (в методе) и ссылкой последователен. В случае полей, объявленных вне метода, компилятор никогда не знает, какой код будет использоваться, когда он не сможет сгенерировать ошибку, поскольку, возможно, какой-либо другой метод будет инициализировать поле до его использования.
Не совсем верно. Локальные переменные должны быть инициализированы только в качестве ссылки. Локальная переменная может быть оставлена неинициализированной, если ее не ссылать. Например:
int x; // Valid
int y;
println("y=" + y); // Not valid since y's value has never been assigned
В Java переменные класса и экземпляра принимают значение по умолчанию (null, 0, false), если они не инициализируются вручную. Однако локальные переменные не имеют значения по умолчанию. Если локальной переменной не присвоено значение, компилятор откажется компилировать код, который его читает. IMHO, это приводит к выводу, что инициализация локальной переменной с некоторым значением по умолчанию (например, null, которое может привести к NullPointerException позже), когда оно объявлено, на самом деле плохо. Рассмотрим следующий пример:
Object o;
if (<some boolean condition>)
o = <some value>;
else
o = <some other value>;
System.out.println(o);
Инициализация o
с нулем совершенно не нужна, поскольку компилятор Java проверяет во время компиляции, что любой путь кода инициализирует o
(с нулевым или некоторое ненулевое значение) перед чтением переменной. Это означает, что компилятор откажется компилировать строку System.out.println(o);
, если вы прокомментируете любую из двух инициализаций переменной o
в фрагменте кода выше.
Это выполняется для Java и возможно, только для Java. Я не знаю о языке, как C #. Тем не менее, в хорошем старом C (и, возможно, C ++), всегда рекомендуется инициализировать переменные при объявлении их AFAIK. Такие «старые школьные» языки программирования могут быть причиной того, что рекомендация всегда инициализировать переменные появляется в книгах и дискуссиях о современных языках, таких как Java, где компилятор отслеживает, была ли инициализирована переменная или нет.
Нужно инициализировать локальные переменные (только когда мы их используем), потому что они не получают значения по умолчанию, такие как переменные экземпляра.
И как основное правило, мы всегда должны инициализировать любую переменную перед использованием Это. В противном случае это может привести к ошибке, например, nullPointer и т. Д.
. Почему локальные переменные не получают значения по умолчанию? Причина в том, что локальные переменные находятся в стеке и видны только в контексте локальных методов, в отличие от переменных экземпляра, которые находятся в куче и имеют область видимости во всей программе.
Поэтому, когда стек закончит значение локального метода, поэтому они должны быть инициализированы явно (когда мы их используем) 2] Они не должны быть инициализированы неявно (с помощью null, 0 или false), например, переменные экземпляра