powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / задачка для гуру
9 сообщений из 9, страница 1 из 1
задачка для гуру
    #34417834
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 public   class  MyClass
{
     public   static   void  main(String[] args)
    {
         final   int  i =  100 ;
         byte  b = i;
        System.out.println(b);
    }
}

вот этот код компилится и работает
А этот
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 public   class  MyClass
{
     public   static   void  main(String[] args)
    {
         int  i =  100 ;
         byte  b = i;
        System.out.println(b);
    }
}

дает ошибку несовместимые типы и не компилится.
Почему?
...
Рейтинг: 0 / 0
задачка для гуру
    #34417897
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
100 умещается в байт и компилер считает что использовать int здесь расточительно. В результате после компиляции получается
byte i = 100;

Спасибо за вопрос. Не знал про подобные оптимизации.
...
Рейтинг: 0 / 0
задачка для гуру
    #34417922
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно так же продемонстрировать то что, не смотря на оптимизацию примитива, авотбоксинг и полиморфизм отрабатывают как надо.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 public   class  MyClass
{
     public   static   void  main(String[] args)
    {
         final   int  i =  100 ;
         byte  b = i;
        System.out.println(((Number)i).getClass().getName());
        print(i);
        print(b);
    }
     static   void  print( int  i)
    {
        System.out.println(((Number)i).getClass().getName());
    }
     static   void  print( byte  i)
    {
        System.out.println(((Number)i).getClass().getName());
    }
}
...
Рейтинг: 0 / 0
задачка для гуру
    #34418087
Фотография oson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно.
То есть компилятор благодаря final знает, что другое число уже не будет назначено для int i, а 100 вполне поместится в byte?
...
Рейтинг: 0 / 0
задачка для гуру
    #34418098
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osonТо есть компилятор благодаря final знает, что другое число уже не будет назначено для int i, а 100 вполне поместится в byte?

Он не только "знает", но ещё и пользуется свои знанием, действительно меняя тип в байткоде.
...
Рейтинг: 0 / 0
задачка для гуру
    #34419229
Vurn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В реальности, если речь не идет о массиве, то в JVM и байт хранится в 4-х байтах. Все манипуляции с байтов производятся с переконвертацией в int и, при необходимости, затем обратно в байт с cast (byte).
Поэтому никогда не возможно присвоить байту int или результат арифметических операций без преобразования (byte).
В случае с funal, компилятор знает чему будет равно его значение в определенной точке и соотвственно, подставляет это значение.
То есть запись вида
Код:
1.
2.
final int i = 100;
byte b = i;

компилятором будет заменена на
Код:
1.
2.
final int i = 100;
byte b = 100;

А подобное присвоение, естественно, ошибок не вызывает. По этой причине, везде, где только можно, рекомендуется использовать модификатор final для переменных.
...
Рейтинг: 0 / 0
задачка для гуру
    #34419315
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VurnТо есть запись вида
Код:
1.
2.
final int i = 100;
byte b = i;

компилятором будет заменена на
Код:
1.
2.
final int i = 100;
byte b = 100;



Это догадки или как?
Если компилировать без оптимизации, со всей отладочной инфой, то код будет
final int i = 100;
byte b = i;
как и прежде.
Если отладочную инфу выключить, то компилятор соптимизирует эти 2 переменные в одну.
...
Рейтинг: 0 / 0
задачка для гуру
    #34419369
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
    0 :   bipush   100 
    2 :   istore_2
    3 :   getstatic       # 2 ; //Field java/lang/System.out:Ljava/io/PrintStream;
    6 :   iload_2
    7 :   invokevirtual   # 3 ; //Method java/io/PrintStream.println:(I)V
    10 :   return 
1. Сохраняет байтовое значение 100 как int в стеке.
2. Забирает из стека интовое значение и работает.
Аналогично в случае без int'овой переменной. Вполне логично.
Суслика видишь? нет. а он есть (с) :-)
...
Рейтинг: 0 / 0
задачка для гуру
    #34419426
Мужик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz VurnТо есть запись вида
Код:
1.
2.
final int i = 100;
byte b = i;

компилятором будет заменена на
Код:
1.
2.
final int i = 100;
byte b = 100;



Это догадки или как?
Если компилировать без оптимизации, со всей отладочной инфой, то код будет
final int i = 100;
byte b = i;
как и прежде.
Если отладочную инфу выключить, то компилятор соптимизирует эти 2 переменные в одну.

Отличие при компиляции с отладочной инфой от без нее будет лишь в том, что во втором случае i вообще не создастся, а в b сразу запишется 100.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / задачка для гуру
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]