OberonCore https://forum.oberoncore.ru/ |
|
Интуитивно понятная ява. https://forum.oberoncore.ru/viewtopic.php?f=27&t=2878 |
Страница 1 из 1 |
Автор: | Alexey Veselovsky [ Пятница, 01 Октябрь, 2010 01:54 ] |
Заголовок сообщения: | Интуитивно понятная ява. |
Код: import java.*; class Test { public static void main(String[] args) { Integer a = 42; Integer b = 42; Integer c = 420; Integer d = 420; System.out.println(a==b); // true System.out.println(c<=d); // true System.out.println(c>=d); // true System.out.println(c==d); // false } } Без коментариев. |
Автор: | Info21 [ Пятница, 01 Октябрь, 2010 08:16 ] |
Заголовок сообщения: | Re: Интуитивно понятная ява. |
Хочется прям возопить: ДОКОЛЕ???!!! |
Автор: | Peter Almazov [ Пятница, 01 Октябрь, 2010 08:37 ] |
Заголовок сообщения: | Re: Интуитивно понятная ява. |
Было бы интересно узнать версии и параметры окружения. Если разберетесь в причинах, отпишитесь - интересно (сам я с ней не работаю). |
Автор: | Alexey Veselovsky [ Пятница, 01 Октябрь, 2010 09:17 ] |
Заголовок сообщения: | Re: Интуитивно понятная ява. |
Peter Almazov писал(а): Было бы интересно узнать версии и параметры окружения. Не зависит. Peter Almazov писал(а): Если разберетесь в причинах, отпишитесь - интересно (сам я с ней не работаю Ну, тут на самом деле всё очень просто. Integer, это вам не int, это вполне себе класс. В яве == для ссылочных типов (ака классов) всегда сравнивает ссылки, а не содержимое классов. Код: Integer a = 420; Тут происходит автобоксинг. Грубо говоря вызывается конструктор класса Integer с аргументом 420. Код: a<=b; Тут произойдет автоанбоксинг. Т.е. из 'a' и 'b' (Integer) вытащат содержащееся там число (int) и сравнят. Итак, a==b сравнит ссылки, a<=b сравнит содержимое. Замечу, что Integer нифига не обычный класс, ибо вообще говоря, перегружать операторы в яве нельзя. Однако остается непонятным почему при a=42 мы имеем таки true. Всё также просто -- по всей видимости объекты для всех чисел что влезают в один байт (-128 ... 127) уже созданы. Соответственно когда мы пишем Integer a = 42, ничего создаваться не будет, 'a' будет просто указывать на уже готовый объектик. Также как и Integer b = 42. Объект один и тот же, поэтому (a==b) == true. |
Автор: | kemiisto [ Пятница, 01 Октябрь, 2010 09:23 ] |
Заголовок сообщения: | Re: Интуитивно понятная ява. |
У мну на 1.6.20 тот же результат. Я так понимаю, тут дело в том, что сравниваются величины не примитивных типов (int), а соотв. ссылочные типы (Integer). А такое поведение оператора сравнения, видимо, объясняется вот чем. Как мы знаем, в Java == compares references, not values. Для малых чисел (диапазон, возможно, нагуглится) заранее создаются соотв. объекты в единственном экземпляре. И любой новый объект Integer с малым intValue указывает на одно и тоже место. А для больших чисел - просто создаются новые объеты. В Пистоне также по-моему (но сравнение по-другому работает). Код: System.out.println(c.intValue()==d.intValue()); // true
|
Автор: | Alexey Veselovsky [ Пятница, 01 Октябрь, 2010 09:27 ] |
Заголовок сообщения: | Re: Интуитивно понятная ява. |
Замечу, что автобоксинг и автоанбоксинг -- это по сути неявное преобразование типов. Отсюда и все беды. |
Автор: | Comdiv [ Пятница, 01 Октябрь, 2010 10:38 ] |
Заголовок сообщения: | Re: Интуитивно понятная ява. |
Peter Almazov писал(а): Было бы интересно узнать версии и параметры окружения. Если разберетесь в причинах, отпишитесь - интересно (сам я с ней не работаю). Начиная с версии 1.5 . До этого автобоксинга не было, и пример бы не скомпилировался. |
Автор: | Peter Almazov [ Пятница, 01 Октябрь, 2010 12:34 ] |
Заголовок сообщения: | Re: Интуитивно понятная ява. |
Гениально! Язык развиваецца... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |