Език за програмиране - абстракция позволяваща представянето на даден проблем
компютър
<------------------------------------------------------>проблем
асемблер C
Pascal
ООП
Програма ООП - съвкупност от обекти. Изпълнението на програмата се извършва чрез обмен на съобщения между обектите.
Обект: абстракция на проблем; съвкупност от данни и процедури които манипулират данните и осигуряват комуникациите между обектите. Процедурите се наричат методи. Всеки метод може да получава съобщения (да бъде викан с едно множество от параметри)и може да генерира отговори (да връща стойности и да изпраща съобщения кум други методи (да ги извиква с едно множество от параметри).Данните от своя страна представляват едно множество от обекти.
Всеки обекти принадлежи към определен тип - клас. Клас: представлява модел (прототип), който дефинира типът на обекта. Всеки обект представлява конкретна променлива (instance ) от даден клас, които притежава свое собствено множество от данни.
Всички обекти от даден клас, могат да получават и изпращат еднакви съобщения и да генерират еднакви отговори.
Всички обекти имат състояние (определяно от стойностите на данните), поведение (определяно от методите си) и идентичност (определяно от уникален адрес на паметта).
За илюстриране на тези понятия ще използвам
клас "кола" и един обект "Колата на George". Обектът - колата на George
е нещо съществуващо, което има своята идентичност със съответни
характеристики (форма, цвят...) и която реализира известни действия
(върви, спира, завива...). Обектите в ООП реализират точно този подход
- те имат идентичност (адрес) имат характеристики (използват се
понятията член данни или характеристики), могат да реализират
определени действия (говори се за поведение или члем функции).
Скриване на данните (капсулация) – процеса
на агрегация на данните от един обект заедно с неговите методи. Тя
въвежда различна видимост на компонентите на обекта (данни и методи) от
методи извън класа.
вътрешна част - обикновено това са данните, които са недостъпни или скрити за методите принадлежащи на други класове. Те са защитени от модифициране от външни методи. Могат да бъдат трансформирани по различни начини, без да засягат останалата част от програмите.
външна част - обикновено това са методите, които представляват интерфейс към останалата част от програмата.
Това означава, че е невъзможно да се действа непосредствено върху данните на дадем обект - трябва да се мине посредством неговите методи, които играят ролята на задължителен интерфейс.В термините на езика извикването на даден метод се нарича изпращане на съобщение към този метод.
Голямото достойнство на капсулацията е, че погледнато отвън един обект се характеризира единствено със спецификацията на методите си. Начинът по който са реализирани данните е без значение. Това маскиране на детайлите често се нарича "абстрактни данни". Начинът на тяхната реализация може да се променя, без това да засяга другите части на програмата.
Капсулацията значително облекчава поддръжката и развитието на класовете - всеки клас се поддържа и променя без да се засягат останалите.
Java използва три ключови думи за да управлява видимостта на компонентите на даден клас - public(видим навсякъде), private (видим само от методите на класа ) и protected (подобно на "private", но видим също и от производните класове - класовете конструирани на базата на този клас посрвсдством механизма за наследяване).
Използване на създадените класове в други
програми
Много често част от кода на дадена програма може да се
използва в други програми. В императивните или още наричани процедурни
езици това обикновено води до пренаписване на кода. В ООП се използва
механизмът на наследяването.
Наследяване: създаването на нов клас (под клас, производен клас) на базата на съществуващ клас(базов клас), които има едновременно както характеристиките на съществуващия клас така и нови, специфични за създавания клас. Наследяването обикновено върви по посока на постъпково създаване чрез специализация на базовия клас.
Когато под клас наследява базов клас той наследява всички компоненти
на базовия клас - данни и методи. В производния клас може да се
дефинират допълнителни компоненти освен наследените.
При промени в базовия клас те се отразяват автоматично във всички негови производни класове.
Дърво на наследствеността
Един клас може да има много производни класове, които се различават по допълнителните си компоненти. Езикът Java (за разлика от други обектно-ориентирани езици като например С++) не допуска множествено наследяване - един клас може да има само един базов клас. Това води до създаване на дървовидни структури от наследяващи се класове. Дърветата на наследяване в ООП приличат много на генеалогичните дървета, но за разлика от последните всеки следващ клас е по специализиран от базовия си.
Взаимозаменяемост на обектите в дърветата на наследствеността
Всеки обект от производен клас притежава данните и методите на базовия клас и следователно може да бъде използван вместо обект от базовия клас. Обратното не е вярно.
В Java всички класове са производни на един базов клас наречен Objet.
Абстрактни класове и интерфейси
Абстрактните класове (ключова дума "abstract" в дефиницията) съдържат абстрактни методи, които не притежават дефиниция (няма описание на метода, а има само неговия прототип - име тип и параметри). Абстрактните класове не позволяват създаването на обекти. Те се използват само като базови класове на производни класове, които задължително трябва да дадат дефиниция на абстрактните методи или да бъдат дефинирани като абстрактни.
Интерфейсите представляват следваща стъпка в посока на абстракцията -
всички техни методи са абстрактни. механизмът на наследяване на един
интерфейс се нарича приложение (implements)
на интерфейса. Един клас може да прилага много интерфейси и това е един
начин за заобикаляне на ограниченията от липсата на множествено
наследяване.
Официалният 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 на навигатор