Идентификаторы, литералы и переменные

Вопрос 1

Что будет, если попытаться откомпилировать и запустить следующий код:

int _ = 10;

System.out.println(_);

а. В любой версии Java код откомпилируется и отработает без проблем.
б. Начиная с версии Java 8 инструкция int _ = 10; не откомпилируется.
в. Начиная с версии Java 9 инструкция int _ = 10; не откомпилируется.
г. В любой версии Java код откомпилируется, но выпадет в ошибку во время выполнения.

в. Начиная с версии Java 9 инструкция int _ = 10; не откомпилируется.

В Java 9 нижнее подчёркивание "_" стало ключевым словом и поэтому больше может быть идентификатором. До 9-й версии нижнее подчёркивание могло входить в состав идентификатора и даже быть единственным символом в составе идентификатора.

Вопрос 2

Что будет, если попытаться откомпилировать и запустить следующий код:

String 3rdParty = "Vector Co., Ltd.";

System.out.println(3rdParty);

а. В любой версии Java код откомпилируется и отработает без проблем.
б. Ни в одной версии Java код не откомпилируется.

б. Ни в одной версии Java код не откомпилируется.

Идентификатор не может начинаться с цифры ни в одной версии Java.

Вопрос 3

Что будет, если попытаться откомпилировать и запустить следующий код:

final String FIRST-PLAYER = "user";

System.out.println(FIRST-PLAYER);

а. В любой версии Java код откомпилируется и отработает без проблем.
б. Ни в одной версии Java код не откомпилируется.

б. Ни в одной версии Java код не откомпилируется.

Идентификатор не может содержать знак минус "-" ни в одной версии Java.

Вопрос 4

Что будет, если попытаться откомпилировать и запустить следующий код:

String = "dragon";

System.out.println();

а. В любой версии Java код откомпилируется и отработает без проблем.
б. Ни в одной версии Java код не откомпилируется.

а. В любой версии Java код откомпилируется и отработает без проблем.

龍 – алфавитный символ и может входить в состав идентификаторов Java. Код откомпилируется и выполнится без проблем и выведет в консоль слово "dragon".

Вопрос 5

Что будет, если попытаться откомпилировать и запустить следующий код:

String = "coffe";

System.out.println();

а. В любой версии Java код откомпилируется и отработает без проблем.
б. Ни в одной версии Java код не откомпилируется.

б. Ни в одной версии Java код не откомпилируется.

☕ (как и другие эмодзи) не является алфавитным символом, символом подчёркивания или знаком доллара и не может входить в состав идентификаторов.

Вопрос 6

Что будет, если попытаться откомпилировать и запустить следующий код:

String String = "String";

System.out.println(String);

а. В любой версии Java код откомпилируется и отработает без проблем.
б. Ни в одной версии Java код не откомпилируется.
в. Код откомпилируется, но во время выполнения вылетит в ошибку.

а. В любой версии Java код откомпилируется и отработает без проблем.

Слово String не является ключевым словом языка и содержит только английские символы, а значит может быть именем переменной. Разумеется, смущает тот факт, что имя класса совпадает с именем переменной, но для Java это не проблема. Создайте новый класс с любым именем (например, Lesson) и объявите переменную с именем Lesson. Как бы вы ни использовали имя класса (например, для вызова статических методов) и одноимённую переменную, Java всегда будет знать, когда вы используете имя класса, а когда имя переменной.

Вопрос 7

Что будет, если попытаться откомпилировать и запустить следующий код:

int x = 1;

while (x < 3) {

int y = x++;

}


System.out.println(x);

а. Код откомпилируется, отработает и выведет на консоль 3.
б. Возникнет ошибка компиляции: variable y is already defined.
в. Код откомпилируется, но возникнет ошибка во время выполнения программы.

а. Код откомпилируется, отработает и выведет на консоль 3.

Фигурные скобки управляющего оператора while создают собственную область видимости переменных. На каждой итерации цикла мы каждый раз и заходим и выходим из этой области. Таким образом, на каждой итерации мы можем заново создавать переменную y, так как она была уничтожена на выходе из предыдущей итерации.

Вопрос 8

Что будет выведено на консоль, если откомпилировать и запустить следующий код:

public static void main(String[] args) {


int a = 1;

int b = 4;


countSum(a, b);


System.out.println(a);

}


public static void countSum(int x, int addendum) {

x = x + addendum;

}

а. 1
б. 5

а. 1

Поскольку в Java переменные передаются в методы только по значению, то параметр x метода countSum действительно пример значение 1, как у аргумента a. Но x и a расположены в разных ячейках в памяти и как бы ни менялось значение x внутри метода, это никак не повлияет на значение a. Так что на консоль попадёт изначальное значение a равное 1.

Вопрос 9

Начиная с какой строки, объект, помеченный в комментарии как bobik будет доступен для сборщика мусора?

class Animal {

public static void main(String[] args) {

Animal dog1 = new Animal(); //bobik

Animal dog2 = new Animal(); //tobik

dog1 = dog2; //1

dog1 = null; //2

dog2 = null; //3

}

}

а. Со строки, помеченной //1.
б. Со строки, помеченной //2.
в. Со строки, помеченной //3.

а. Со строки, помеченной //1.

Изначально на объект bobik ссылается переменная dog1. В строке, помеченной //1, этой переменной присваивается ссылка на тот же объект, на который ссылается переменная dog2, то есть на объект tobik.

С этого момента на объект bobik не ссылается ни одна переменная и объект становится доступен для сборщика мусора.