J_Лекция 4 Преобразование типов.ppt
- Количество слайдов: 21
Преобразование и приведение типов № 4
1. Преобразование conversion и приведение casting типов Casting - явное преобразование типа Например, приведение типа Object к типу Button b 1=(Button)(my. Vector. element. At(5)); Conversion - неявное преобразование типа. Например, преобразование типа Color к типу Object Color my. Color; my. Vector. add. Element(my. Color); Преобразование conversion и приведение casting выполняется o для простых типов o для ссылок на объект
2. Преобразование простых типов Преобразование выполняется для простых типов boolean, byte, char, int, long, float, double При следующих условиях: q приравнивании переменных, имеющих разный тип q при вызове метода и передаче ему аргументов q при арифметическом преобразовании
3. Приравнивание переменных простых типов Приравнивание, без потери точности: double d; int i; d=i; Не правильное приравнивание: double d; short s, s=d – ошибка - несопоставимый тип Основные правила преобразования: 1. Тип boolean не может быть преобразован ни к одному простому типу; 2. Разрешается расширяющее преобразование типа без потери точности 3. Невозможно сужающее преобразование типа с потерей точности 4. При приравнивании невозможно преобразовать byte -> char short -> char int byte short long float double
4. Преобразование простых типов при вызове методов При вызове методов разрешено расширяющее преобразование простых типов float f=3. 14; double d; double Math. cos(double); d=Math. cos(f); При вызове методов запрещено сужающее преобразование простых типов при вызове метода double d=12. 0; Vector. element. At(int); Object obj=my. Vector. element. At(d); //error ошибка - несопоставимый тип
5. Преобразование простых типов в арифметических выражениях short s=9; int i= 10; float f=11. 7 F, double d=12. 2; if( ++s * I >= f/d ) {//do something} Выполняется цепочка преобразований: short->int; float/double ->double; int -> double; double>=double Правила преобразования в унарных операциях: 1. Единственный операнд в унарной операции int, short, char преобразуется к int 2. Другие простые типы в унарных операциях не преобразуются. Правила преобразования в бинарных операциях: Если один оператор double то второй преобразуется к double Иначе Если один оператор float то второй преобразуется к float Иначе Если один оператор long то второй преобразуется к long Иначе оба оператора int.
6. Приведение простых типов Casting (приведение) – это явное указание на преобразование типа Не обязательно использовать приведение при расширяющем преобразовании int i; double d=(double) i; Обязательно использовать приведение при сужающем преобразовании: int i; double i=(int) d; short s=259; byte b=s; //compile error byte b=(byte) s; // OK явное сужающее преобразование Short s=259 0000 0001 0000 0011 Byte s=3 0000 0011
7. Преобразование ссылок на объект приравнивании Conversion - неявное преобразование ссылок на объект. Old. Type x=new Old. Type(); New. Type y=x; Преобразование возможно для ссылок на разные типы объектов: o Классы Button, File. Writer o Интерфейсы Clonable, Layout. Manager o Массивы float[], int[][], Text. Area[]
8. Преобразование ссылок на объект приравнивании Animal Cat Преобразование на одном уровне иерархии дает ошибку компиляции Animal anim=new Animal(); Cat cat= new Cat(); Rat rat=new Rat(); Object o= new Object(); cat=rat; //error Rat Преобразования вверх по иерархии происходит успешно Animal anim=new Animal(); Cat cat= new Cat(); Rat rat=new Rat(); Object o= new Object(); anim=cat; //Ok anim=rat; //Ok o=rat; //Ok
9. Преобразование ссылок на массивы Animal Cat Rat Animal anim=new Animal(); Cat cat= new Cat(); Rat rat=new. Rat(); Object o= new Object(); Animal[] animals=new Animal[5]; Cat[] cats=new Cat[3]; Rat[] rats=new Rat[2]; Object[] os=new Object[5]; Преобразование к интерфейсу Cloneable clon=cats; // Ok Преобразование массива к классу Object O = animals; O = cats; O = rats; Преобразование массива к классу cat = cats; //error Преобразование ссылок на массивы выполняется вверх по иерархии (по правилу преобразования ссылок на объекты) animals = cats; //Ok animals = rats; //Ok Преобразование ссылок на массивы вниз по иерархии приводит к ошибке компиляции rats=os; //error
10. Правила преобразования для ссылок Old. Type is a class Old. Type is an interface Old. Type is an array New. Type is a Old. Type должен New. Type должен class быть Object производным от New. Type должен быть Object New. Type is an interface Old. Type должен расширять интерфейс для New. Type Old. Type должен быть производным интерфейсом от New. Type должен быть Cloneable New. Type is an array Compiler error Old. Type должен быть массивом ссылок на объекты такого типа, который преобразуется к New. Type
11. Правила преобразования для ссылок o o o Тип интерфейса может быть преобразован только к интерфейсу или типу Object. Причем New. Type должен быть базовым интерфейсов для Old. Type. Тип класса может быть преобразован к классу или интерфейсу, Причем, New. Type должен быть базовым для Old. Type. Массив может быть преобразован к классу Object, к интерфейсу Cloneable или к массиву. Причем типы элементов массивов должны допускать преобразование.
12. Преобразование и приведение ссылок на объекты по иерархии классов Object Fruit Citrus implements Squeezable Tangerine Lemon Grapefruit Преобразование вверх не требует приведения (casting) : Tangerine tang=new Tangerine(); Citrus cit=tang; Преобразование вниз требует явное приведение (casting) : Citrus cit=new Citrus(); Tangerine tang=cit; //Compile error Преобразование вверх для интерфейса не требует приведения: Grapefruit g=new Grapefruit(); Squeezable sq=g; //OK Преобразование вниз для интерфейса требует явное приведение: Grapefruit g 2=sq; //compile error
13. Преобразование ссылок при вызове метода При вызове метода разрешено преобразование вверх по иерархии наследования. Правила преобразования: Тип интерфейса может быть преобразован только к интерфейсу или типу Object. Причем New. Type должен быть базовым интерфейсов для Old. Type. Тип класса модет быть преобразован к классу или интерфейсу, Причем New. Type должен быть базовым для Old. Type. Массив может быть преобразован к классу Object, к интерфейсу Cloneable или к массиву. Причем типы элементов массивов должны допускать преобразование. Cat[] cats=new Cat[3]; Cloneable clon=cats; //OK Vector my. Vec=new Vector(); Tangerine tang=new Tangerine(); My. Vec. add. Element(tang); //OK автоматическое преобразование к типу Object
14. Компиляция программы Object Fruit Citrus implements Squeezable Serializable Object Vector Stack Tangerine Lemon Grapefruit На этапе компиляции разрешено указать в явном виде на преобразование типов вниз по иерархии классов: Citrus cit = new Citrus(); Lemon lemon = (Lemon) cit; На этапе компиляции разрешено использовать преобразование типов вверх по иерархии классов без явного указания: Fruit fruit = lemon; //OK Vector vector=new Vector(); vector. add(lemon); Stack stack=new Stack(); stack. push(vector);
14. Выполнение программы Serializable Object Stack stack Vector Citrus Object Stack lemon Fruit На этапе компиляции не известно, на какой объект будет ссылаться переменная при выполнения программы, поэтому разрешено любое преобразование. На этапе выполнения известно, на какой объект ссылается переменная. Поэтому разрешены только преобразования вверх по иерархии классов. Citrus cit = new Citrus(); Lemon lemon = (Lemon) cit; //java. lang. Class. Cast. Exception Lemon lem 1=new Lemon(); citrus=lem 1; Lemon lem 2=(Lemon)citrus; Tangerine tan=(Tangerine)citrus; //OK //java. lang. Class. Cast. Exception
15. Правила приведения (casting) типов при компиляции Old. Type is a not final a final class Old. Type is an interface Old. Type is an array New. Type is not a final class Old. Type должен быть производным от New. Type Или наоборот Old. Type должен быть производным от New. Type OK Всегда допустимо Old. Type должен быть типа Object New. Type is New. Type a final должен быть class производным от Old. Type и New. Type должны быть одного класса New. Type должен расширять интерфейс Old. Type должен быть типа Object
15. Правила приведения (casting) типов при компиляции Old. Type is a not final a final class Old. Type is an interface Old. Type is an array New. Type is OK an Всегда interface допустимо Old. Type должен расширять интерфейс New. Type OK Всегда допустимо New. Type должен New. Type is New. Type – an array должен быть типа Object Compiler error Old. Type должен быть массивом такого типа, который может быть приведен к New. Type быть Cloneable
16. Правила приведения типов при компиляции Первая проверка соответствия типов – во время компиляции программы Old. Type и New. Type являются классами и один класс наследует от другого. Old. Type и New. Type являются массивами и оба массива содержат ссылки на типы, которые допускают преобразование. Всегда возможно приведение между интерфейсом и не final объектом. Вторая проверка соответствия типов – во время выполнения программы: Если New. Type является классом, то класс выражения, которое приводится к New. Type, должен быть New. Type или наследовать от New. Type. Если New. Type является интерфейсом, то класс выражения, которое приводится к New. Type, должен расширять интерфейс New. Type.
17. Приведение типов Object Fruit Citrus implements Squeezable Lemon Grapefruit Tangerine Grapefruit g, g 1; Citrus c; Tangerine t; g=new Grapefruit(); c=g; //выполняется преобразование casting не требуется Теперь c указывает на базовую часть объекта Grapefruit. g 1=(Grapefruit)c; // правильно выполняется casting t=(Tangerine)c; // выбрасывает исключение
18. Выводы o o Преобразование простых типов данных и ссылок на объекты происходит в операторах присваивания, при вызове методов или в арифметических операциях. Расширяющее преобразование простых типов данных может быть выполнено неявно, в то время как сужающее изменение простых типов требует явного приведения. Правила преобразования типов ссылок на объекты являются более сложными, поскольку учитывают различные комбинации типов. Основная идея состоит в том, что неявное автоматическое преобразование типов выполняется вверх по иерархии наследования. Изменение типа вниз по иерархии может быть допущено компилятором при условии явного указания на приведение типов. Однако на этапе выполнения программы преобразование вниз по иерархии классов не может быть произведено, в этом случае будет возбуждено исключение.
J_Лекция 4 Преобразование типов.ppt