Java как объектно-ориентированный язык программирования
Изучение Java как языка программирования, определение его пользовательского класса. Рассмотрение понятия преобразования примитивных и ссылочных типов (расширение и сужение) и виды приведений. Запрещенные преобразования и применение приведений.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | реферат |
Язык | русский |
Дата добавления | 27.03.2014 |
Размер файла | 64,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http:www.allbest.ru/
Содержание
Введение
1. Преобразование типов и виды приведений
1.1 Виды приведений
1.2 Преобразование примитивных типов (расширение и сужение)
1.3 Преобразование ссылочных типов (расширение и сужение)
2. Запрещенные преобразования и применение приведений
2.1 Запрещенные преобразования
2.2 Применение приведений
3. Поместите на форму объект Image и организуйте при помощи RadioGroup выбор рисунка на канве (одна и двух фигур: круг или квадрат)
Заключение
Список используемых источников
Введение
Как нам, наверное, уже известно, java -- объектно-ориентированный язык программирования. Главным атрибутом объекта в java является его класс. Именно класс объекта определяет его поведение в программе. Думаю, что в любом объектно-ориентированном языке есть возможность определять пользовательские классы (за исключением, наверное, каких-то специализированных языков, где это, попросту, не нужно), определять их поведение, определять взаимоотношение этих классов со всеми остальными. Одним из видов такого отношения является наследование. Если говорить простыми словами, то если класс A наследуется от класса B, тон получает от родителя его методы и поля и, также, может определять какие-то свои. В большинстве случаев наследник должен как-то расширять или конкретизировать функционал предка, но иногда возникает необходимость обращаться к объектам нижнего уровня так, как к объектам верхнего уровня иерархии классов. В таком случае никак не обойтись без преобразования типов.
1. Преобразование типов и виды приведений
1.1 Виды приведений
В Java предусмотрено семь видом приведений:
Тождественное (identity);
Расширение примитивного типа (widening primitive);
Сужение примитивного типа (narrowing primitive);
Расширение объектного типа (widening reference);
Сужение объектного типа (narrowing reference);
Преобразование к строке (String);
Запрещенные преобразования (forbidden);
Рассмотрим их по отдельности.
Самым простым является тождественное преобразование. В Java преобразование выражения любого типа к точно такому же типу всегда допустимо и успешно выполняется.
Это важно для возможности утверждать с теоретической точки зрения, что любой тип в Java может участвовать в преобразовании, хотя бы в тождественном. Java программирование расширение сужение
1.2 Преобразование примитивных типов (расширение и сужение)
Для простых типов расширение означает, что осуществляется переход от менее емкого типа к более ёмкому. Например, от типа byte (длина 1 байт) к типу int (длина 4 байта). Такие преобразование безопасны в том смысле, что новый тип всегда гарантировано вмещает в себя все данные, которые хранились в старом типе, и таким образом не происходит потери данных. Именно поэтому компилятор осуществляет его сам, незаметно для разработчика:
byte b=3;
int a=b;
Следующие 19 преобразований являются расширяющими:
От byte к short, int, long, float, double
От short к int, long, float, double
От char к int, long, float, double
От int к long, float, double
От long к float, double
От float к double
Обратите внимание, что нельзя провести преобразование к типу char от типов меньшей или равной длины (byte, short) или, наоборот, к short от char без потери данных. Это связано с тем, что char, в отличие от остальных целочисленных типов, является знаковым.
Тем не менее, следует помнить, что даже при расширении данные все таки могут быть искажены. Это приведение значений int к типу float и приведение значений типа long к типу float или double. Хотя эти дробные типы вмещают гораздо большие числа, чем соответствующие целые, но у них меньше значащих разрядов.
Например:
long a = 111111111111L;
float f=a;
a=(long)f; // () это как раз и есть операция преобразования типа
System.out.println(a); //результат 111111110656
Обратите внимание - сужение - означает, что переход осуществляется от боле емкого типа к менее емкому. При таком преобразовании есть риск потерять данные. Например, если число типа int было больше 127, то при приведении его к byte значения битов старше восьмого будут потеряны. В Java такое преобразование должно совершаться явным образом, т.е. программист в коде должен явно указать, то он намеревается осуществить такое преобразование и готов потерять данные.
При сужении целочисленного типа к более узкому целочисленному все старшие биты, не попадающие в новый тип ,просто отбрасывается. Не производится никакого округления или других действий для получения более корректного результата:
System.out.println((byte)383);
System.out.println((byte)384);
System.out.println((byte)-384);
Результатом будет:
127
-128
-128
Видно, что знаковый бит при сужении не оказал никакого влияния, так как был просто отброшен - результат приведения обратных чисел (384, -384) оказался одинаковым. Следовательно, может быть потеряно не только точное абсолютное значение, но и знак величины.
1.3 Преобразование ссылочных типов (расширение и сужение)
Преобразование объектных типов лучше всего иллюстрируется с помощью дерева наследования. Рассмотрим небольшой пример наследования:
class Parent {
int x;
}
class ChildY extends Parent {
int y;
}
class ChildZ extends Parent {
int z;
}
Объекты класса Parent обладают только одним полем x, а значит, только ссылки типа Parent могут ссылаться на такие объекты. Объекты класса ChildY обладают полем y и полем x, полученным по наследству от класса Parent. Стало быть, на такие объекты могут указывать ссылки типа ChildY или Parent. Пример:
Parent p = new ChildY();
Обратите внимание, что с помощью такой ссылки p можно обращаться лишь к полю x созданного объекта. Поле y недоступно, так как компилятор, проверяя корректность выражения p.y, не может предугадать, что ссылка p будет указывать на объект типа ChildY во время исполнения программы. Он анализирует лишь тип самой переменной, а она объявлена как Parent, но в этом классе нет поля y, что и вызовет ошибку компиляции.
Аналогично, объекты класса ChildZ обладают полем z и полем x, полученным по наследству от класса Parent. Значит, на такие объекты могут указывать ссылки типа ChildZ и Parent.
Таким образом, ссылки типа Parent могут указать на объект любого из трех рассматриваемых типов, а ссылки типа ChildY и ChildZ - только на объекты точно такого же типа. Теперь можно перейти к преобразования ссылочных типов на основе такого дерева наследования.
Расширение означает переход от более конкретного типа к менее конкретному, т.е. переход от детей к родителям. Подобно случаю с примитивными типами, этот переход производиться самой JVM при необходимости и «незаметен» для разработчика, то есть не требует никаких специальных преобразования.
Parent p1=new ChildY();
Parent p2=new ChildZ();
В обеих строках переменным типа Parent присваивается значение другого типа, а значит, происходит преобразование. Поскольку это расширение, оно производиться автоматически и всегда успешно.
Нужно заметить, что при подобном преобразовании с самим объектом ничего не происходит. Несмотря на то что, например, поле y класса ChildY теперь недоступно, это не значит, что оно исчезло. Такое существенно изменение объекта не возможно. Он был порожден от класса ChildY и сохраняет все его свойства. Изменился лишь тип ссылки, через которую идет обращение к объекту.
Обратный переход, то есть движение по дереву наследования вниз, к наследникам, является сужением. Если ссылка типа Parent ссылается на объект типа Parent или ChildZ, то переход к ChildY невозможен, так как в обоих случаях объект не обладает полем y, которое объявлено в классе ChildY. JVM во время исполнения проверит корректность перехода. Если он возможен, преобразование будет проведено. Если же нет - возникнет ошибка (обычно ClassCastException).
Parent p=new ChildY();
ChildY cy = (ChildY)p; //верно
Parent p2=new ChildZ();
ChildY cy2 = (ChildY)p2; //ошибка
Преобразование к строке
Любой тип может быть приведен к строке, т.е. к экземпляру класса String. Такое преобразование является исключительным в силу того, что охватывает абсолютно все типы.
Различные типы преобразуются к строке следующим образом:
Числовые типы записываются в текстовом виде без потери точности представления. Сначала на основе примитивного значения порождается экземпляр соответствующего класса-«обертки», затем у него вызывается метод toString(). Но поскольку эти действия снаружи незаметны, JVM оптимизирует их и преобразует примитивные значения в текст напрямую.
Для объектных величин вызывается метод toString(). Если метод возвращает null, то результатом будет строка “null”.
Для null-значения генерируется строка “null”.
2. Запрещенные преобразования и применение приведений
2.1 Запрещенные преобразования
Не все переходы между произвольными типами допустимы. Например, к запрещенным преобразованиям относятся: переходы от любого ссылочного типа к примитивному и наоборот (кроме преобразования к строке), boolean можно привести только к этому типу или же к строке. Кроме того невозможно привести друг к другу, классы находящиеся на соседних ветвях дерева наследования. В примере, который рассматривался для иллюстрации ссылочных типов, переход от ChildY к ChildZ запрещен.
Этим список запрещенных преобразований не исчерпывается. Он довольно широк и в тоже время все варианты достаточно очевидны, поэтому подробно рассматриваться не будут. Желающие могут получить полную информацию из спецификации.
Разумеется, попытка осуществить запрещенное преобразование вызовет ошибку.
2.2 Применение приведений
Ситуации применения преобразования типов могут быть сгруппированы следующим образом:
Присвоение значений переменным (assignment). Не все переходы допустимы при таком преобразовании - ограничения выбраны таким образом, чтобы не могла возникнуть исключительная ситуация.
Вызов метода. Это преобразование применяется к аргументам вызываемого метода или конструктора. Такое приведение никогда не порождает ошибок. Так же приведение осуществляется при возвращении значения метода.
Явное приведение. В этом случае явно указывается, к какому типу требуется привести исходное значение.
Оператор конкатенации производит преобразование к строке своих аргументов.
Числовое расширение. Числовые операции могут потребовать изменения типа аргумента(ов). Это преобразование имеет особое название - расширенное, так как выбор целевого типа может зависеть не только от исходного значения, но и от второго аргумента операции.
3. Поместите на форму объект Image и организуйте при помощи RadioGroup выбор рисунка на канве (одна и двух фигур: круг или квадрат)
1) После запуска программы в окне изображается две полосы прокрутки. Вертикальная полоса будет управлять движением по вертикали, горизонтальная - по горизонтали.
2) Наводя указатель мыши на одну из двух фигур, можно выбирать, какая из этих фигур связана с полосами прокрутки.
procedure TForm1.ScrollBar1Change (Sender: TObject);
begin
if num then Shape1.Left := ScrollBar1.Position
else Shape2.Left := ScrollBar1.Position
end;
procedure TForm1.ScrollBar2Change (Sender: TObject);
begin
if num then Shape1.Top := ScrollBar2.Position
else Shape2.Top := ScrollBar2.Position
end;
procedure TForm1.Shape1MouseMove
(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Shape1.Brush.Color := clAgua;
Shape1.Brush.Color := clFuchsia;
Num := True;
ScrollBar1.Position:= Shape1.Left;
ScrollBar2.Position:= Shape1.Top;
end;
procedure TForm1. Shape2MouseMove
(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Shape2.Brush.Color := clFuchsia;
Shape2.Brush.Color := clAgua;
Num := False;
ScrollBar1.Position:= Shape2.Left;
ScrollBar2.Position:= Shape2.Top;
end;
procedure TForm1. FormCreate (Sender: TObject);
begin
num := True;
end;
Заключение
Java является строго типизированным языком программирования, а это означает, то что каждое выражение и каждая переменная имеет строго определенный тип уже на момент компиляции.
Операция преобразования типов представляет механизм явного преобразования объектов данного класса в другой тип.
Явное преобразование типов выражения применяется тогда, когда неявное преобразование нежелательно или когда без него выражение недопустимо. Одна из задач С++ - интеграция АТД и встроенных типов. Чтобы достигнуть этого, существует механизм функции-члена, обеспечивающей явное преобразование.
Надо иметь в виду, что «модный» становится все более частым словом в компьютерном мире. Как пользователи хотят иметь инструменты этого года (вероятно, по этой причине операционные системы называются по тому году, в котором они выпущены), программисты любят работать с последним языком программирования и первыми овладеть им. Можно наверняка утверждать, что Java -- не последний из языков ООП. Через несколько следующих лет найдется кто-то с новым модным языком, и все прыгнут в этот поезд, думая, что нельзя отставать, и забывая, что большинство программистов в мире всё ещё печатают на клавиатуре на добром старом Cobol! (С последним утверждением можно поспорить.)
Список используемых источников
1. http://oop-java.blogspot.com/2006/02/blog-post_21.html
2. http://abc.vvsu.ru/Books/u_programm/page0022.asp
3. http://www.javaprobooks.ru/java-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/preobrazovanie-tipov-v-java-custing.html
4. http://lib.ru/CPPHB/cpptut.txt_with-big-pictures.html
5. http://msdn.microsoft.com/ru-ru/library/dd233220.aspx
Размещено на Allbest.ru
Подобные документы
История создания языка Java. Основные принципы объектно-ориентированного программирования. Структура, особенности синтаксиса и примеры прикладных возможностей использования языка Java, его преимущества. Перспективы работы программистом на языке Java.
курсовая работа [795,9 K], добавлен 14.12.2012Язык Java как простой, обьектно-ориентированный, многопоточный язык программирования, разработанный компанией Sun Microsystems для расширения возможностей сети Internet. Типы данных, лексика и управляющие структуры данного языка программирования.
презентация [46,1 K], добавлен 25.04.2014Методология объектно-ориентированного программирования в Java. Понятия класса, объекта и объектной переменной. Динамическая и статическая объектные модели. Логическое структурирование приложения. Наследование в Java. Отличия интерфейсов от классов.
курс лекций [547,2 K], добавлен 01.05.2014Разработка графического редактора для рисования двухмерной и трехмерной графики, используя язык программирования Java и интерфейсы прикладного программирования Java 2D и Java 3D. Создание графического редактора 3D Paint. Основные методы класса Graphics.
курсовая работа [197,5 K], добавлен 19.11.2009Этапы развития, особенности и возможности языка программирования Java; происхождение названия. Приложения Sun Microsystems: идеи, примитивные типы. Python - высокоуровневый язык программирования общего назначения: структуры данных, синтаксис и семантика.
реферат [79,0 K], добавлен 23.06.2012Изучение объектно-ориентированного языка программирования Java, его функциональные возможности. Создание программного кода. Описание классов и методов, использованных в программе. Руководство пользователя, запуск сервера и клиентского приложения.
курсовая работа [1,8 M], добавлен 16.09.2015Создание языка программирования с помощью приложения "Java". История названия и эмблемы Java. Обзор многообразия современных текстовых редакторов. Обработка строки. Методы в классе String. Java: задачи по обработке текста. Примеры программирования.
курсовая работа [276,1 K], добавлен 19.07.2014Объектно-ориентированный язык программирования: общая характеристика и свойства. Базовый и производный классы, конструкторы производного класса. Конструкторы и неопределенность при множественном наследовании. Роль наследования при разработке программ.
курсовая работа [688,3 K], добавлен 23.12.2013Сетевые возможности языков программирования. Преимущества использования Java-апплетов. Классы, входящие в состав библиотеки java.awt. Создание пользовательского интерфейса. Сокетное соединение с сервером. Графика в Java. Значения составляющих цвета.
курсовая работа [508,1 K], добавлен 10.11.2014Общая характеристика и оценка возможностей языка программирования си-шарп, его сходные и отличительные черты от С++ и Java. Разработка с помощью данного языка программирования лексического и синтаксического анализатора. Составление таблиц разбора.
курсовая работа [111,6 K], добавлен 11.06.2010