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.

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

Версии на   Java [https://en.wikipedia.org/wiki/Java_version_history]:

Version Release
date
End of Free
Public Updates[5][6]
Extended
Support Until
JDK Beta 1995 ? ?
JDK 1.0 January 1996 ? ?
JDK 1.1 February 1997 ? ?
J2SE 1.2 December 1998 ? ?
J2SE 1.3 May 2000 ? ?
J2SE 1.4 February 2002 October 2008 February 2013
J2SE 5.0 September 2004 November 2009 April 2015
Java SE 6 December 2006 April 2013 December 2018
Java SE 7 July 2011 April 2015 July 2022
Java SE 8 (LTS) March 2014 January 2019 for Oracle (commercial)
December 2020 for Oracle (non-commercial)
At Least September 2023 for AdoptOpenJDK
March 2025
Java SE 9 September 2017 March 2018 N/A
Java SE 10 (18.3) March 2018 September 2018 N/A
Java SE 11 (18.9 LTS) September 2018 N/A for Oracle
At Least September 2022 for AdoptOpenJDK
Vendor specific
Java SE 12 (19.3) March 2019 N/A for Oracle
September 2019 for OpenJDK
N/A
Legend:
Old version
Older version, still supported
Latest version
Future release

 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