Наследование (создание иерархии объектов)




Язык Java

Зарождения языка

Свое начало язык берет в 1991 года, когда Джеймс Гослинг, Патрик Ноутон), Крис Вирт, Эд Франк и Майк Шеридан предложили язык Java для разработки программного обеспечения контроллеров. Требования – компактность, надежность и независимость от платформы (поскольку производителей таких устройств уже было много). Были предприняты попытки модифицировать язык программирования C++, но разработчики поняли, что его возможностей не хватает для решения поставленных задач, и создали новый. Первое название языка Oak, затем его сменили на Java. Поскольку разные контролеры реализуют различные машинные языки, пришлось ввести так называемую виртуальную машину JVM (JVM - Java Virtual Machine). Для каждого типа контроллера создавалась своя виртуальная машина, которая выполняла программу, представленную на едином для всех компиляторов языка Java промежуточном языке. Располагая компилятором языка Java, достаточно для внедрения Java программы на некотором процессоре установить соответствующую этому процессору виртуальную машину JVM.

Итак, JVM машина решила проблему переносимости (мобильности) программного кода. Кроме того, наличие особой среды выполнения управляемого кода повысило защищённость и надёжность программ.

Компания Sun Microsystems выпустила первую версию языка Java в начале 1996 года. На данный момент последней версией Java является Java SE 7, вышедшая 7 июля 2011 года.

 

ООП в языке Java

 

Основные элементы ООП: объекты и классы. К примеру, реализуем класс CBall, имеющий два свойства. Каждый раз при вызове функции Move() координата x увеличивается на 5, а координата у - на 10 пикселей.

Если не указан модификатор доступа то в С++ по умолчанию private, в java – public.

Все методы класса должны быть определены внутри определения класса. Соответственно, в Java не используются прототипы функций. Недопустимо определение вложенных классов. Нельзя определять методы вне тела класса, создавая таким образом глобальные функции. Тем не менее, внутри класса можно определять статические методы и поля (с помощью ключевого слова static), которые будут играть роль глобальных методов и данных.

 

// Java class CBall { private int x, у; // Закрытые координаты x и у шара public void Move () // Описание открытой функции перемещения шара {x= x+5; y= y+10; } public void Set (int vX, int vY) // Описание открытой функции установки {x= vX; y= vY; } // координат шара public void Show () // Описание открытой функции выдачи на консоль {System,out.prlntln ("x= " + x + " y= " + у);} } // C++ class CBall private int x, у; // Закрытые координаты x и у шара public: void Move () // Описание открытой функции перемещения шара {x= x+5; y= y+10;} void Set (int vX, int vY) // Описание открытой функции установки {x= vX; y= vY;} // координат шара void Show () // Описание открытой функции выдачи на консоль {System::Console::WriteLine ("x= " + x + " y= " + у);} };

 

По синтаксису: на языке Java доступ (private/public) необходимо указывать перед объявлением каждой переменной и перед описанием каждой функции, и здесь двоеточия отсутствуют. В конце объявления класса отсутствует «.


 

Создание и использование объектов:

// Java CBall ball= new CBall (); // Создать объект в управляемой куче ball.Set (7, 11); // Установить исходное состояние объекта ball.Move (); // Переместить объект ball.Show (); // Выдать текущие координаты объекта // C+ + CBall ball; // Создан объект ball класса CBall ball.Set (7, 11); // Установить исходное состояние объекта ball ball.Move (); // Переместить объект ball ball.Show (); // Выдать текущие координаты объекта ball CBall *pBall= new CBall ();//динамическое создание В неуправляемой куче pBall -> Set (17, 21); pBall -> Move (); pBall -> Show ();

 

В языках Java запрещены указатели. Вместо них используются ссылочные переменные, значения которых управляются системой. Ссылочные переменные ссылаются к данным, размещённым в управляемой куче. Оператор new создаёт здесь объект в управляемой куче. Удаляют объекты сборщики мусора.

 

Наследование (создание иерархии объектов)

Язык Java запрещает множественное наследование классов, но разрешают множественное наследование интерфейсов (Интерфейс- это конструкция языка программирования Java, в рамках которой могут описываться только абстрактные публичные (abstract public) методы и статические константyst свойства (final static)).Описание класса CColBall, порождённого из базового класса CBall (добавили свойство: цвет).

//Java Public/abstract/final class CColBall extends CBall //не указывается модификатор доступа, по умолчанию считается public { private int col; // Закрытая переменная цвет public void Set (int vCol, int vX, int vY) {col= vCol; super.Set (vX, vY); } public void Show () // Открытая функция ' Показать данные' {System.out.println ("col= "+ col); super.Show ();} } //С++ class CColBall: public CBall // Порождение из класса CBall { private: int col; public: void Set (lnt vCol, lnt vX, int vY) {col= vCol; CBall::Set (vX, vY); } void Show () // Функция 'Показать данные' {Console::Write ("col= " + col); CBall::Show (); } };

 

Тело функции Set() класса CColBall присваивает значение новой переменной col и посредством функции Set() класса CBall присваивает значения закрытым переменным базового класса CBall (оператор привязки "::" и ключевые слова super соотносят функцию Set() к классу CBall). Аналогично функция Show() класса CColBall использует функцию Show() базового класса CBall, чтобы выдать скрытые значения x и у. Функция Move() класса CColBall наследуется из класса CBall, оставшись неизменённой. При ссылке к функциям базового класса использовано ключевое слово super.

 

Перегруженные функции

C++ позволяет определять в программе несколько функций с одним и тем же именем. Такие функции удобны и широко применяются в объектно-ориентированном программировании, когда надо выполнить аналогичные операции над данными разных типов.

Подобные функции называются перегруженньши функциями. Имея одно и тоже имя, перегруженные функции отличаются количеством или типом параметров.

//Java class Calculation { public void add(int a, int b) { int с = a + b; } public void add(float a, float b) { float с = a + b; } } // С++ class Calculation { void add (lnt &a, int &b) {int c=a+b;} void add (double &a, double &b) { double c=a+b;} }

В Java перегруженные методы постоянно находятся в одном классе. Они имеют одну и ту же область видимости с классом. В этом языке нельзя перегружать операторы ++, +, *…и т.д.

Передача аргументов в Java осуществляется только о значению (передаются копии, а не сами переменные). В С++ возможны передачи аргументов по ссылке и значению.

 

Конструкторы

Как и в C++, в языке Java имя конструктора совпадает с именем класса, он открытый (public) и не имеет возвращаемого значения. Есть конструкторы по умолчанию, а есть и перегруженные, так как конструктор – это метод, который можно перегружать.

Eсли в классе описан явно хотя бы один конструктор с параметрами, то конструктор по умолчанию (без параметров) создаваться автоматические уже не будет (его в такой ситуации надо описывать явно).

 

class Circle { public double x; // абсцисса центра public double y; // ордината центра public double r; // радиус public Circle() { x = 0.0; y = 0.0; r = 1.0; } public Circle(double a, double b, double s) { x = a; y = b; r = s; } } class Circle { public: double x,y,z; Circle() { x = 0.0; y = 0.0; r = 1.0; } }  

Обработка исключений

//Java public class Exc { public static void main(String[] args) { int x, у, z; try {x= 5; y= 0; z= x/y; System.out.println("z= "+z); } catch(ArithmeticException e) {System.out.println("Exception is catched");} }  

 

Число catch() неограниченно. К механизму обработки исключений в Java имеют отношение ключевые слова: — try, catch, throw и finally. Схема работы этого механизма следующая. Вы пытаетесь (try) выполнить блок кода, и если при этом возникает ошибка, система возбуждает (throw) исключение, ко­торое в зависимости от его типа вы можете перехватить (catch) или пере­дать умалчиваемому (finally) обработчику.

Исключения делятся на несколько классов, но все они имеют общего предка — класс Throwable. Его потомками являются подклассы Exception и Error.

 

Виртуальные функции

 

Механизм виртуальных функций позволяет в иерархию наследования классов ввести особые функции - виртуальные функции, которые, будучи определёнными в базовом классе, могут применяться в объектах наследуемых классов, а при необходимости и переопределяться. При этом обращаться к этим функциям необходимо по объекту через указатель базового класса для языка С++ и через ссылочную переменную базового класса для языка Java.

//Java class А { // Объявление функции F() public void F () {System.out.println("A.F");} } class В extends А { // Наследуемая функция F() переопределяется public void F () {System.out.println("B.F");> } class С extends А { // Наследуемая функция F() переопределяется public void F () {System.out.println("C.F");> } class Test { public static vold main () { A a= new A (); B b= new B (); C c= new C ();   A r= a; r.F();   r=b; r.F(); r= c;   r.F(); } } /*Result: A.F B.F C.F C.F */   //C++ class А { public: // Объявление виртуальной функции F() virtual void F () {Console::WriteLine ("A:: F");} }; class В: public А { public: // Наследуемая виртуальная функция F() переопределяется void F () {Console::WriteLine ("B:: F");} }; class С: public В { public: void F () {Console::WrlteLlne ("C:: F");} }; }; void rnain <) { А *pA= new А; В *pB= new В; С *pC= new С; pA -> F (); pB->F(); pC -> F (); } /*Result: A:: F B:: F C:: F */

Если объявить функцию виртуальной, мы можем динамически, при необходимости, во время выполнения программы, присвоить ссылке на базовый класс ссылку на требуемый объекта порождённого класса, и наша программа изменив функционирование, выполняя виртуальную функцию этого объекта.

 

Абстрактные функции

При объявлении абстрактной функции в классе необходимо указать требуемый доступ - protected или public. Поскольку абстрактная функция должна переопределяться в порождённом классе, она не может иметь доступ private.

Абстрактными функциями представляют одноимённые функции порождённых классов, тела которых могут несколько отличаться для объектов различных порождаемых классов. Как видим, абстрактная функция схожа с виртуальной функцией, поскольку требует переопределения, но в отличие от виртуальной функции она не содержит тело.

 

//Java abstract class А { // Объявление абстрактную функции F() abstract public void F (); } class В extends А { // Наследуемая абстрактная функция F() переопределяется public void F () {System.out.println ("B.F");> } class С extends В { // Наследуемая абстрактная функция F() не переопределяется //public void F () {System.out.println ("C.F");} } class Test { public static vold maln () { В b= new В (); С c= new С (); b.F(); c.F(); } } /*Result: B.F B.F */ //C++ // Абстрактный класс class А { protected: // Объявление чистой виртуальной функции F() virtual void F (}= О; }; class В: public А { public: // Наследуемая чистая виртуальная функция F() переопределяется void F () {Console::WriteLine ("B:: F");} }; class С: public В { public: // Наследуемая чистая виртуальная функция F() не переопределяется //void F () {Console::WriteLine ("C:: F");} }; vold main () { B *pB=new B; С *pC= new С; pB -> F (); pC -> F (); } /*Result: B:: F B:: F */

 

Вывод: язык Java похож на С++, так как он от него начал свое развитие. При этом языки Java был реализован, позволяя как простое создание и использование компонентов, так существенное повышение надёжности и защищённости многокомпонентных программ, правда проигрывая языку С++ в эффективности их выполнения. Меньшая эффективность обусловлена применением языками Java специальных сред выполнения программного кода. Неуправляемый программный код языка С++ превратился в управляемый программный код в языках Java.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: