page précédantetable des matièrespage suivante
 
 

Обектно-ориентирано програмиране




Език за програмиране - абстракция позволяваща представянето на даден проблем

компютър    <------------------------------------------------------>проблем
                       асемблер      C Pascal                        ООП

Програма  ООП - съвкупност от обекти. Изпълнението на програмата се извършва чрез обмен на съобщения между обектите.

Обект: абстракция на проблем; съвкупност от данни и процедури които манипулират данните и осигуряват комуникациите между обектите. Процедурите се наричат методи.  Всеки метод може да получава съобщения (да бъде викан с едно множество от параметри)и може да генерира отговори (да връща стойности и да изпраща съобщения кум други методи (да ги извиква с едно множество от параметри).Данните от своя страна представляват едно множество от обекти.

 Всеки обекти принадлежи към определен тип - клас. Клас: представлява модел (прототип), който дефинира типът на обекта. Всеки обект представлява конкретна променлива (instance ) от  даден клас, които притежава свое собствено множество от данни.

Всички обекти от даден клас, могат да получават и изпращат еднакви съобщения и да генерират еднакви отговори.

Всички обекти имат състояние (определяно от стойностите на данните), поведение (определяно от методите си) и идентичност (определяно от уникален адрес на паметта).

 За илюстриране на тези понятия ще използвам клас "кола" и един обект "Колата на George". Обектът - колата на George е нещо съществуващо, което има своята идентичност със съответни характеристики (форма, цвят...) и която реализира известни действия (върви, спира, завива...). Обектите в ООП реализират точно този подход - те имат идентичност (адрес) имат характеристики (използват се понятията член данни или характеристики), могат да реализират определени действия (говори се за поведение или члем функции). 
 

Скриване на данните (капсулация)  – процеса на агрегация на данните от един обект заедно с неговите методи. Тя въвежда различна видимост на компонентите на обекта (данни и методи) от методи извън класа.

вътрешна част - обикновено това са данните, които са недостъпни или скрити за методите принадлежащи на други класове.  Те са защитени от модифициране от външни методи. Могат да бъдат трансформирани по различни начини, без да засягат останалата част от програмите. 

 външна част - обикновено това са методите, които представляват интерфейс към останалата част от програмата.

Това означава, че е невъзможно да се действа непосредствено върху данните на дадем обект - трябва да се мине посредством неговите методи, които играят ролята на задължителен интерфейс.В термините на езика извикването на даден метод се нарича изпращане на съобщение към този метод.

Голямото достойнство на капсулацията  е, че погледнато отвън един обект се характеризира единствено със спецификацията на методите си. Начинът по който са реализирани данните е без значение. Това маскиране на детайлите често се нарича "абстрактни данни". Начинът на тяхната реализация може да се променя, без това да засяга другите части на програмата.

Капсулацията значително облекчава поддръжката и развитието на класовете - всеки клас се поддържа и променя без да се засягат останалите.

Java използва три ключови думи за да управлява видимостта на компонентите на даден клас  - public(видим навсякъде), private (видим само от методите на класа )  и protected (подобно на  "private", но видим също и от производните класове - класовете конструирани на базата на този клас посрвсдством механизма за наследяване).

Използване на създадените класове в други програми
Много често част от кода на дадена програма може да се използва в други програми. В императивните или още наричани процедурни езици това обикновено води до пренаписване на кода. В ООП се използва механизмът на наследяването.
 

Наследяване: създаването на нов клас (под клас, производен клас) на базата на съществуващ клас(базов клас), които има едновременно както характеристиките на съществуващия клас така и  нови, специфични за създавания клас. Наследяването обикновено върви по посока на постъпково създаване чрез специализация на базовия клас.

Когато под клас наследява базов клас той наследява всички компоненти на базовия клас - данни и методи.  В производния клас може да се дефинират допълнителни компоненти освен наследените.

При промени в базовия клас те се отразяват автоматично във всички негови производни класове.

Дърво на наследствеността

 Един клас може да има много производни класове, които се различават по допълнителните си компоненти. Езикът Java (за разлика от други обектно-ориентирани езици като например С++) не допуска множествено наследяване - един клас може да има само един базов клас. Това води до създаване на дървовидни структури от наследяващи се класове. Дърветата на наследяване в ООП приличат много на генеалогичните дървета, но за разлика от последните всеки следващ клас е по специализиран от базовия си.

Взаимозаменяемост на обектите в дърветата на наследствеността

Всеки обект от производен клас притежава данните и методите на базовия клас и следователно може да бъде използван вместо обект от базовия клас. Обратното не е вярно.

В Java всички класове са производни на един базов клас наречен Objet.

Абстрактни класове и интерфейси

Абстрактните класове  (ключова дума  "abstract" в дефиницията) съдържат абстрактни методи, които не притежават дефиниция (няма описание на метода, а има само неговия прототип - име тип и параметри). Абстрактните класове не позволяват създаването на обекти. Те се използват само като базови класове на производни класове, които задължително трябва да дадат дефиниция на абстрактните методи или да бъдат дефинирани като абстрактни.

Интерфейсите представляват следваща стъпка в посока на абстракцията - всички техни методи са абстрактни. механизмът на наследяване на един интерфейс се нарича приложение (implements) на интерфейса. Един клас може да прилага много интерфейси и това е един начин за заобикаляне на ограниченията от липсата на множествено наследяване.
 
 

 Java виртуална машина

Официалният Web на Java е http://www.java.com/.

Съдържа инструменти и дистрибуционния кит  на Java за Windows  както и за Unix/Linux.

 Една част от примерите в този курс са взети от книгата "Да мислим на  Java" от Bruce Eckel която може да се намери на   http://www.mindviewinc.com/downloads/TIJ-3rd-edition4.0.zip

 23 mai 1995, Sun Microsystems, Inc обявява официално раждането на  Java на конференцията"Sun World'95" в San Francisco  Пролетта на  1995, Java няма никаква практическо приложение но в края на годината достига рекорд по популярност.

Версии на   Java:

 Java представлява частично компилатор и частично - интерпретатор. Текста на  Java се компилира до универсален бинарен псевдо-код за виртуална  Java  машина. Той често се нарича "J-code" или "bytes code".

Виртуалната машина  Java (JVM) се реализира обикновено като интерпретатор. Тя се държи като стекова машина, управляваща heap в паметта.

Спецификациите се разпространяват свободно - всеки може да създаде JVM

JVM и езикът представляват спецификация, която не зависи от използваната платформа.

Кодът на Java е напълно преносим. Едно и също приложение може да се изпълнява върху всички платформи, които осигуряват JVM

Основната единица в една програма на  Java е класът. Класовете се търсят и зареждат динамично по време на изпълнението, когато са необходими на дадена апликация.

Java представлява бърз интерпретатор, но има всички недостатъци на интерпретаторите - същото приложение написано на С++ е значително по-бързо

Доста JVM  използват моментна компилация на байт кода преди изпълнението за оптимизиране на програмата - нарича се компилация JIT ("Just In Time").
 
 

Структура на  Java програма

Първа програма на  Java

// изписва поздрав на екрана
public class Hello{
    public static void main (String
[] args){
         System.out.println("Hello world");
   }
}

application : програма, която се изпълнява от интерпретатора java

appletпрограма, която се изпълнява от "plug-in" java на навигатор



page précédantetable des matièrespage suivante