Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SCJP, маленький тест.. вы будете удивлены :), Java Compiler - посоветуйте книгу, линк 
V
    Опции темы
polosatij
  Дата 15.8.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



встретился недавно со следующей делемой.. как вы думаете, что выдаст данный код?

Код

    public static void main(String[] args) {
        Boolean b = true;
        System.out.println(b ? new Integer(10) : new Float(100)); 
    }


все те, кто подумал, что код данный выдаст 10 не прошли этот тестsmile Вы удивлены?  smile 

правильный результат: 10.0 smile

теперь хотелось бы узнать, почему это так.. посмотрев в байт код.. хм.. и действительно, после того как .... =>  integer будет сконвертирован в float. почему это так?
я бы тоже хотел знать ответ на данный вопрос. сейчас я готовлюсь к сдаче scjp и подобные вопросы меня просто убивают.. посему, никто не мог бы подсказать какой путёвой книги по Java 1.5 Compiler? кинуть линком или путёвой документацией на подобную "идеотскую" тему?  smile 


--------------------
PM   Вверх
Antropoid
Дата 15.8.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: 2
Всего: 16



Ашо странного? Нет, я ответа не знал, но вроде все логично: рано или поздно JVM начнет сравнивать целое и дробное, для этого приведет целое к дробному, сравнит дробное с дробным и возвратит дробный результат...


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
polosatij
Дата 15.8.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(Antropoid @  15.8.2007,  13:14 Найти цитируемый пост)
Ашо странного? Нет, я ответа не знал, но вроде все логично: рано или поздно JVM начнет сравнивать целое и дробное, для этого приведет целое к дробному, сравнит дробное с дробным и возвратит дробный результат... 


я что-то не очень понимаю, зачем ей сравнивать целое и дробное??.. может ты мне можешь объяснить? smile



--------------------
PM   Вверх
_Michael
Дата 15.8.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 23.6.2007
Где: з полонини

Репутация: 2
Всего: 6



polosatij, здесь вот очень много таких различных особенностей и казусов. smile недавно просто переглядал
Цитата

...рано или поздно JVM начнет сравнивать целое и дробное, для этого приведет целое к дробному, сравнит дробное с дробным и возвратит дробный результат...

Че то я не очень понимаю. Ведь b = true; значить создается new Integer(10) а к new Float(100) даже не доходит. разве не так? smile

Это сообщение отредактировал(а) _Michael - 15.8.2007, 13:24


--------------------
...не убивайся ни о чем - все временно,
хоть ночь темна но светлым днем беременна...

Саади
PM MAIL   Вверх
Antropoid
Дата 15.8.2007, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: 2
Всего: 16



Думаю потому, что ? :  - тернарная операция и ее операнды(до : и после) должны быть одной масти.


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
polosatij
Дата 15.8.2007, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(Antropoid @  15.8.2007,  13:26 Найти цитируемый пост)
Думаю потому, что ? :  - тернарная операция и ее операнды(до : и после) должны быть одной масти. 



если это так.. то почему данный пример:

Код

    public static void main(String[] args) {
        Boolean b = true;
        System.out.println(b ? new Integer(10) : "hi"); 
    }


не конвертирует Integer в String, если посмотреть в байткод? smile значит это правило касается только Number? smile


--------------------
PM   Вверх
_Y_
Дата 15.8.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Цитата(Antropoid @ 15.8.2007,  13:26)
Думаю потому, что ? :  - тернарная операция и ее операнды(до : и после) должны быть одной масти.

Пожалуй, собака именно здесь. Ведь на печать выводится не 
Код

new Integer(10)
, а результат действия всего оператора. Что-то в духе
Код

obj = b ? new Integer(10) : new Float(100);
System.out.println(obj);

Понятное дело, что правая сторона присвоения возвращает определенный тип.

Но это все, естественно, ИМХО


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
polosatij
Дата 15.8.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(_Y_ @  15.8.2007,  13:37 Найти цитируемый пост)

Понятное дело, что правая сторона присвоения возвращает определенный тип.



вот мне, например, не понятное дело.. посмотрим такой пример:

Код

class Main2 {
    
    public static void main(String[] args) {
        Boolean b = true;
        Object obj =  b ? new Integer(10) : "hi";
        System.out.println(obj); 
    }
}


и что ты хочешь сказать, Integer теперь String?  smile

Добавлено через 2 минуты и 45 секунд
Цитата(_Michael @  15.8.2007,  13:23 Найти цитируемый пост)
polosatij, здесь вот очень много таких различных особенностей и казусов. 



спасибо, но я имел ввиду не примеры.. а примеры с конкретными темами в одной книге  smile 


--------------------
PM   Вверх
AlexeyVorotnikov
Дата 15.8.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 10
Всего: 18



Цитата(polosatij @ 15.8.2007,  14:41)
вот мне, например, не понятное дело.. посмотрим такой пример:

Код

class Main2 {
    
    public static void main(String[] args) {
        Boolean b = true;
        Object obj =  b ? new Integer(10) : "hi";
        System.out.println(obj); 
    }
}


и что ты хочешь сказать, Integer теперь String?  smile

Нет, Integer теперь Object.


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
polosatij
Дата 15.8.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(AlexeyVorotnikov @  15.8.2007,  13:56 Найти цитируемый пост)
Нет, Integer теперь Object. 


мы не после объявления говорим, а про конвертацию переменных:

new Integer(10) : "hi";

 smile 



--------------------
PM   Вверх
Antropoid
Дата 15.8.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

Репутация: 2
Всего: 16



Цитата(polosatij @  15.8.2007,  13:31 Найти цитируемый пост)
не конвертирует Integer в String, если посмотреть в байткод?  значит это правило касается только Number? 

ИМХО да, это правило только для Number


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
polosatij
Дата 15.8.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



Цитата(Antropoid @  15.8.2007,  14:09 Найти цитируемый пост)
ИМХО да, это правило только для Number 



ню так, а где почитать про такие правила?  smile 


--------------------
PM   Вверх
AlexeyVorotnikov
Дата 15.8.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 10
Всего: 18



Цитата(polosatij @  15.8.2007,  15:11 Найти цитируемый пост)
ню так, а где почитать про такие правила?

Java Language Specification, CHAPTER 15 Expressions, 15.25 Conditional Operator ? :
Цитата

The type of a conditional expression is determined as follows:

    * If the second and third operands have the same type (which may be the null type), then that is the type of the conditional expression.
    * If one of the second and third operands is of type boolean and the type of the other is of type Boolean, then the type of the conditional expression is boolean.
    * If one of the second and third operands is of the null type and the type of the other is a reference type, then the type of the conditional expression is that reference type.
    * Otherwise, if the second and third operands have types that are convertible (§5.1.8) to numeric types, then there are several cases:
          o If one of the operands is of type byte or Byte and the other is of type short or Short, then the type of the conditional expression is short.
          o If one of the operands is of type T where T is byte, short, or char, and the other operand is a constant expression of type int whose value is representable in type T, then the type of the conditional expression is T.
          o If one of the operands is of type Byte and the other operand is a constant expression of type int whose value is representable in type byte, then the type of the conditional expression is byte.
          o If one of the operands is of type Short and the other operand is a constant expression of type int whose value is representable in type short, then the type of the conditional expression is short.
          o If one of the operands is of type; Character and the other operand is a constant expression of type int whose value is representable in type char, then the type of the conditional expression is char.
          o Otherwise, binary numeric promotion (§5.6.2) is applied to the operand types, and the type of the conditional expression is the promoted type of the second and third operands. Note that binary numeric promotion performs unboxing conversion (§5.1.8) and value set conversion (§5.1.13). 
    * Otherwise, the second and third operands are of types S1 and S2 respectively. Let T1 be the type that results from applying boxing conversion to S1, and let T2 be the type that results from applying boxing conversion to S2. The type of the conditional expression is the result of applying capture conversion (§5.1.10) to lub(T1, T2) (§15.12.2.7). 



--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
polosatij
Дата 15.8.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 1
Всего: 8



AlexeyVorotnikov

ты забыл линк  smile спасиба  smile 


--------------------
PM   Вверх
ekr
Дата 15.8.2007, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

Репутация: 3
Всего: 19



Цитата(polosatij @  15.8.2007,  14:11 Найти цитируемый пост)
ню так, а где почитать про такие правила?

Книгу с такими вопросами для подготовки к экзамену sj5cp выложил на своем блоге и на http://courses.4shared.com в разделе books/sj5cp.
Там в архиве есть и программа-тестер.




--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1008 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.