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/