Готовлюсь к сертификационному экзамену по Java (OCA, 1Z0-808), с трудом прохожу тесты Enthuware. Вот уже неделю волосы стоят дыбом и не опускаются от вопроса - что же курили создатели?
Образец кода:
public class TestClass {
public static void main(String[] args){
byte b = 127;
System.out.println((b+=1)+" "+((Object)b).getClass());
byte a = 127;
(
Read more... )
Comments 22
И соответственно тебе без ошибки выдаёт System.out.println((a+1)+" "+((Object)(a+1)).getClass()); ты ведь результат вычисления a+1 не пытаешься ничему присвоить, сразу выводишь на печать
А вот результат операции += меня удивил. Оказывается он автоматически кастит к нужному типу. То есть a+=1 не эквивалетно a=a+1, а эквивалетно a = (byte)(a+1) возможно я даже знал это когда то, но забыл
На самом деле такого безумия в джаве много
Например Integer.valueOf(127) == Integer.valueOf(127) тебе вернёт true, а Integer.valueOf(128) == Integer.valueOf(128) вернёт false. Выглядит нелепо, а по факту для значений меньше 128 Integer.valueOf не создёт постоянно новые объекты а берёт их из кеша если это возможно.
Но если честно, на практике вся эта ересь никогда почти не встречается. Не понимаю почему ею так любят мучить людей на собеседованиях.
Reply
Reply
Попробуйте вместо 1 использовать переменную "c", которую вы заранее объявили как byte и присвоили туда 1. Если оба операнда имеют тип byte, то и сложение a = a + c будет происходит в рамках byte, не будет расширения диапазона. И просто standalone выражение a + c будет byte.
В Джаве есть трюки, чтобы сказать, что числовая константа имеет тип long (напр., 123L), но нет ни единого трюка, чтобы сказать, что она byte. Надо брать интовое число и down-cast'ить. Видимо, это редко кому надо, поэтому так сделано. Если вместо 1 вы напишете ((byte)1), то будут вам байты без выхода в инты.
https://stackoverflow.com/questions/5193883/how-do-you-specify-a-byte-literal-in-java
Reply
Т.е.
byte a = 127
byte c = 1
System.out.println((a+c)+" "+((Object)(a+c)).getClass());
Печатает
128 class java.lang.Integer
А вот:
byte a = 127;
byte c = 1;
System.out.println(((byte)(a+c))+" "+((Object)((byte)(a+c))).getClass());
Печатает
-128 class java.lang.Byte
В общем, тип Byte он только для хранения, арифметики у него своей нет.
Reply
Reply
Reply
Reply
Reply
Reply
Reply
Я́ва (индон. и яв. Jawa) - остров в составе Индонезии (столица Индонезии, Джакарта, расположена на этом острове)
Reply
Leave a comment