Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Вопрос о приведении типов


Автор: maddoc 3.4.2006, 21:26
Уважаемые Жава Гуру!
Просветите новичка вот в чем
Код

class Black {
  public static void main(String[] args) {
    short s1 = 1;        //1
    char c1 = 1;         //2
    byte b1 = s1;        //3
    byte b2 = c1;        //4
    final short s2 = 1;  //5
    final char c2 = 1;   //6
    byte b3 = s2;        //7
    byte b4 = c2;        //8
}}


ошибка компиляции в стр 3 и 4, а в 7 и 8 все ОК.
Почему?

Автор: powerOn 3.4.2006, 21:37
в этих строках ты приводишь "больший" тип к "меньшему"
short и char "больше" чем byte

Автор: w1nd 3.4.2006, 21:38
Всё просто. Типы short и char вмещают в себя вдвое больше бит, чем byte. А когда ты объявляешь переменную, как final - компилятор знает, что она меняться больше не будет. Значения в строках №5 и №6 занимают заведомо меньше восьми бит. Чтобы они тоже не компилировались, следует их проинициализировать числами > 255.

Автор: maddoc 3.4.2006, 21:44
2 MoonCat вам спасибо, но я имел в виду то что ответил w1nd (и вам спасибо).
все равно, как то не понятно, значение значением, но даже 0(типа Short 2 байта), а как же он это проглатывает?

Автор: powerOn 3.4.2006, 21:45
Цитата

следует их проинициализировать числами > 255.



w1nd, немного поправлю : между -129 и 128

Автор: LSD 3.4.2006, 23:09
Для final переменных производится inline, если модифицировать код:
Код
class Black
{ 
  public static void main(String[] args)
  {
    short s1 = 1;        //1
    char c1 = 1;         //2
    byte b1 = (byte)s1;  //3
    byte b2 = (byte)c1;  //4
    final short s2 = 1;  //5
    final char c2 = 1;   //6
    byte b3 = s2;        //7
    byte b4 = c2;        //8
    System.out.println(s1+c1+b1+b2+s2+c2+b3+b4);
  }
}

чтобы он компилировался, то вот что мы получим после компиляции:
Код
class Black
{
    Black()
    {
    }

    public static void main(String args[])
    {
        int i = 1;
        int j = 1;
        byte byte0 = (byte)i;
        byte byte1 = (byte)j;
        int k = 1;
        int l = 1;
        System.out.println(i + j + byte0 + byte1 + 1 + 1 + k + l);
    }
}

как видишь код был оптимизирован, а final переменных не осталось вообще.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)