Јава (програмски језик)

С Википедије, слободне енциклопедије
Иди на навигацију Иди на претрагу
Јава
Java logo.gif
Лого програмског језика Јава
Оригинални називенгл. Java
Изговара сејава
Моделструктурирани, објектно-оријентисани
Појавио се1995.
Аутор(и)Џејмс Гозлинг
Дизајнер(и)Sun Microsystems
Актуелна верзијаJDK SE13
Типови променљивихстатички, јаки, сигурни, номинални
Имплементацијемноге
УтицајиObjective-C, C++, Smalltalk, Eiffel, Mesa
Утицао наC#, D, J#, Ada 2005, ECMAscript, PHP, Scala
Оперативни системивишеплатформски језик
ЛиценцаГНУ-ова општа јавна лиценца / Java Community Process
Веб-сајтwww.oracle.com/us/technologies/java

Јава (енгл. Java, изговор: јава, ∗џава) је објектно-оријентисани програмски језик, који је развила компанија Sun Microsystems почетком 1990-их година.

Многи концепти Јаве су засновани на језику Оберон, Никлауса Вирта, творца Паскала, Модуле и других језика, и Ханспетера Месенбека. Избацили су концепт модула и увели пакете какве данас знамо, који се ослањају на фајл систем и увели формално концепт класа из објектно-оријентисане парадигме. Осим тога, језик има синтаксу сличну језицима C и C++, али је много строжи при превођењу, дизајниран тако да буде независан од платформе, и са поједностављеним управљањем меморијом. Претпоставља се да је ово урађено због популарности језика C, али и због једноставности неких структура. Прва верзија је званично објављена 1995. године.

Јава је, уз Котлин, званично подржан језик за израду мобилних апликација за Андроид уређаје.[1]

Карактеристике Јаве[уреди | уреди извор]

Програмски језик Јава треба да буде:

  • једноставан - да буде систем у коме би се лако програмирало, без потребе за компликованим уходавањем и који користи постојећи начин размишљања. Синтакса језика Јава је унапређена верзија синтаксе C++
  • објектно оријентисан - објектно оријентисано пројектовање представља технику програмирања фокусирану на податке(објекте) и на интерфејсе ка тим објектима
  • дистрибуиран - Јава поседује исцрпну библиотеку рутина за рад са ТCP/IP протоколима, као што су HTTP и FTP. Јава апликације могу да приступају објектима преко мреже и преко URL-а, са подједнаком лакоћом као да приступају локалном систему датотека
  • робустан - Јава је намењена за писање програма који морају бити поуздани на много начина. Истиче се у раној провери могућих проблема, каснијој динамичкој провери(током извршавања) и елиминацији ситуација у којима лако долази до појаве грешака
  • безбедан - Јава је намењена коришћењу у мрежним/дистрибуираним окружењима. Према томе, много је труда уложено у безбедност. Омогућава конструкцију система који су заштићени од вируса и злонамерне модификације. Од самог почетка, Јава је пројектована да потпуно онемогући одређене врсте напада, као што су прекорачење извршног стека, приступ меморији изван дела додељеног процесу, читање или уписивање датотека без дозволе...
  • неутралан - компајлер ствара објектну датотеку, чији је формат независан од оперативног система на коме се покреће. Компајлирани код се може извршавати на многим процесорима, под претпоставком присуства извршног система Јава. Јава компајлер остварује ово тако што генерише бајткод инструкције, које немају никакве везе са архитектуром коришћеног рачунара, већ се подједнако лако интерпретирају на свакој машини, а исто тако лако се преводе и у одговарајући машински код
  • преносив - овде не постоје аспекти који су зависни од имплементације. Величине примитивних типова су фиксне, као и њихово понашање у аритметици. Такође, библиотеке које су део система дефинишу интерфејсе који су преносиви
  • интерпретиран - исти Јава бајткод се може извршавати на сваком компјутеру за који постоји Јава интерпретер. Будући да је линковање постепен и лакши поступак, сам развој може бити бржи
  • перформантан - мада су перформансе преведеног бајткода обично више него довољне, постоје ситуације када су потребне боље перформансе. Бајткод може да буде преведен током извршавања у машински језик
  • вишенитан - предности вишенитне обраде су бољи интерактивни одзиви и понашање у реалном времену
  • динамичан - Јава је пројектована тако да се прилагођава окружењу које се стално унапређује. Библиотеке могу слободно да додају нове методе и поља, без утицаја на клијенте. У Јави је прилично једноставно проналажење информација приликом извршавања програма.

Историја Јаве[уреди | уреди извор]

James Gosling и Patrick Naughton, група инжињера компаније Sun, су иницирали језички пројекат Јава у јуну 1991. Језик је назван Храст (енгл. Oak), и био је намењен за програмирање кућних електронских уређаја (телевизора, видео рекордера и сл.). Име пројекта Храст је касније промењено у Јава, по бренду Јава кафе (енгл. Java Coffee), која је добила име по истоименом острву Јава, тако да лого језика Јава приказује чашу вруће кафе.[2] Постоји још једна верзија порекла имена језика, која се односи на алузију на апарат за кафу као пример кућног уређаја, за који је програмски језик првобитно креиран.[3] Гослинг је Јава дизајнирао са истом синтаксом као у C/C++ како би системски и апликативни програмери лакше научили језик.

Sun Microsystems је прву јавну имплементацију објавио као Јава 1.0 1996. године. Обећавао је Write Once, Run Anywhere (WORA), обезбеђујући извршавање кода на популарним платформама без утрошка времена. Прилично безбедан и са сигурносним подешавањима, дозвољавао је ограничења приступа мрежи и датотекама. Главни веб прегледачи убрзо су уградили могућност покретања Јава аплета на веб страницама и Јава је брзо постала популарна. Артур ван Хоф је поново написао преводилац за Јава 1.0 у Јави како би се строго придржавао спецификације језика Јава 1.0. Са појавом Јава 2 (првобитно објављен као Ј2SЕ 1.2 у децембру 1998. - 1999), нове верзије су имале вишеструке конфигурације изграђене за различите типове платформи. Ј2ЕЕ је укључивао технологије и API за пословне апликације које се обично извршавају у сервер окружењу, док Ј2МЕ садржи API оптимизован за мобилне апликације. Десктоп верзија је преименована у Ј2SЕ. 2006. године, у маркетиншке сврхе, Sun је преименовао нове верзије Ј2 у Јаvа ЕЕ, Јаvа МЕ и Јаvа SЕ.

Године 1997. Sun Microsystems обратио се ISO/IEC JTC 1 уреду за стандардизацију, а касније Ecma International како би формализовао Јаву, али се убрзо повукао из процеса. Јава остаје de facto стандард, који се контролише кроз процесе Јава заједнице. У једном тренутку, Sun је већину својих Јава имплементација учинио доступним без наплате, упркос лиценцираном статусу софтвера. Sun је стварао приход од Јаве продајом лиценци за специјализоване производе као што је Java Enterprise System.

Дана 13. новембра 2006, Sun је издавао већи део своје Јава виртуелне машине (JVM) као бесплатни и open-source софтвер (FOSS), под условима наведеним у GNU General Public Licence (GPL). 8. маја 2007., Sun је завршио поступак, стављајући сав свој JVM основни код доступан као free software/open source дистрибуцију, осим малог дела кода на који Sun није имао ауторска права.

Sun-ов потпредседник Рич Грин рекао је да је у погледу Јаве Sun имао идеалну улогу еванђелисте. Након што је компанија Oracle Corporation преузела Sun Microsystems у 2009–10, Oracle се описао као управитељ Јава технологије са великом посвећеношћу подстицању учешћа и транспарентности заједнице. То није спречило Oracle да поднесе тужбу против Google-а убрзо након тога због употребе Јаве унутар Android SDK-а (погледајте одељак о Android-у). Јава софтвер се извршава на свему, од лаптопа до центара података, играчких конзола до научних супер рачунара. 2. априла 2010. James Gosling поднео је оставку у компанији Oracle.

У јануару 2016. Oracle је објавио да ће за Јава run-time окружења произведена из JDK 9 прекинути додатак прегледача.

Принципи[уреди | уреди извор]

У стварању Јава језика ослањало се на пет основних циљева:

  1. Мора бити једноставан, објектно оријентисан и препознатљив.
  2. Мора бити темељан и сигуран.
  3. Мора бити архитектички неутралан и преносив.
  4. Мора да се извршава са високим перформансама.
  5. Мора бити интерпретиран, праћен и динамичан.

Верзије[уреди | уреди извор]

Од марта 2019. подржана је Јава 8; Јава 8 и 11 као верзије за дугорочну подршку (LTS). Главне издања Јава верзија, заједно са датумима њиховог објављивања:

  • 1991. Претеча Јаве намењена мрежном кућном окружењу
  • 1994. Усмерење према Интернету
  • 1995. Језик Јава лансиран на SunWorld конференцији
  • 1996. Sun развија JDK 1.0 (кодно име Oak)
  • 1997. Појављује се JDK 1.1
  • 1998. Крајем године појављује се нови JDK означен са J2SE 1.2
  • 2000. Појављује се J2SE 1.3
  • 2002. Појављује се J2SE 1.4
  • 2004. Појављује се J2SE 5.0 – интерна ознака J2SE 1.5
  • 2006. Sun објављује Java SE 6
  • 2010. Java постаје власништво компаније Oracle [4]
  • 2011. Појављује се Java SE 7
  • 2014. Појављује се Java SE 8
  • 2017. Појављује се Java SE 9
  • 2018. Појављује се Java SE 10
  • 2018. Појављује се Java SE 11
  • 2019. Појављује се Java SE 12
  • 2019. Појављује се Java SE 13

Извршавање Јава кода[уреди | уреди извор]

Јава платформа, тј. Јава окружење у ком се програм извршава, дизајнирана је тако да што мање зависи од специфичних карактеристика конкретног рачунарског система.

Јава се извршава коришћењем Јава виртуелне машине -ЈVМ (енгл. Јаva Virtual Machine) [5] - језгро Јаве, апстрактна машина која постоји само у меморији.

Јава је језик који се преводи и интерпретира. Јава изворни код (*.java фајл) након компајлирања, компајлером javac, се преводи у изворни код бајткод (*.class фајл). Формирани бајткод је исти за све архитектуре рачунара и представља инструкције за Јава виртуелну машину. Бајткод у Јава виртуелној машини, јава интерпретатором - јаva, се дешифрује и интерпретира у извршни код, погодан за извршавање на рачунару, одговарајућем хардверу.

У зависности од ЈVМ, за исти изворни код можемо добити различите извршне кодове, за различите платформе.

Јава изворни код и бајткод остају исти без обзира на којој се платформи извршава програм -“Write once, run everywhere”.[6]

Јавина преносивост, међутим, изазива губитак перформанси.

То је зато што се тек приликом интерпретирања бајткод преводи у машински за конкретну платформу. Ово може бити проблем ако се исти код више пута интерпретирана истој платформи.

Губитак перформанси је смањен коришћењем Just-in-time (срп. "у право време") или JIT компајлера. JIT компајлер преводи Јава методе у машински код за конкретну платформу на којој се користи.

Уништавање објеката[уреди | уреди извор]

Уклањање непотребних објеката из меморије обавља garbage collector. Овај процес ради независно од покренутих програма и самостално одлучује које објекте ће уклонити из меморије. Осим уклањања сувишних објеката он врши дефрагментацију меморије. Његовим кориштењем се програмер ослобађа посла који се односи на ослобађање меморије кроз програмски код. На овај начин се не мора водити рачуна о деструкторима већ се њихов посао изводи аутоматски. Garbage collector је могуће покренути и ручно.

Синтакса[уреди | уреди извор]

Пример кода[уреди | уреди извор]

// Ако се класа зове Pozdrav, име фајла мора бити Pozdrav.java

public class Pozdrav {
    // Главној методи се предаје низ параметара унетих са командне линије

    public static void main(String[] args) {
        System.out.println("Здраво свете!");
    }
}

Идентификатори[уреди | уреди извор]

Идентификатор служи за идентификовање неке конструкције у Јави(нпр. променљивих, класа, метода, итд). Идентификатор мора почети словом, знаком за долар или цртом за подвлачење, док у преосталом делу идентификатора могу да се појаве и цифре. Пошто у Јави постоји разлика између великих и малих слова, 'Sunce' и 'sunce' су два различита идентификатора.

Резервисане речи[уреди | уреди извор]

Резервисане речи су идентификатори који имају специјалну намену у језику Јава и не могу се користити за именовање других ентитета(променљивих, класа, метода).

Резервисане речи јаве су: abstract, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, extends, final, finally, float, for, goto, if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, strictfp, super, switch, synchronized, this, throw, throws, transient, try, void, volatile и while.

Осим ових, резервисане су и вредности: true, false и null.

Литерали[уреди | уреди извор]

Литерали у Јави су константе примитивног типа или конкретан примерак класе String.

  • Целобројни литерали у Јави могу бити записани као: декадни, октални или хексадекадни (а од верзије 7 и као бинарни).
  • Реални литерали су константе које се записују у облику покретне тачке. Мора садржати бар једну цифру и било децималу, било експонент. У Јави разликујемо два типа реалних литерала: float и double. Уколико је литерал типа float слово f или F мора се навести на крају литерала, док је double подразумевани тип за реални литерал, те се слово d или D не мора навести.
  • Логички литерали су вредности "да" и "не", односно "истинито" и "неистинито". У Јави се записују као true(истинито) и false(неистинито).
  • Знаковни литерал је било који знак, осим апострофа и обрнуте косе црте, или ескејп секвенца. Стринговни литерал је ниска таквих знакова између наводника. Ескејп секвенце које се појављују у Јави:
   '\"  - апостроф
   '\"'  - наводник
   '\\'  - обрнута коса црта
   '\r'  - знак за повратак на почетак рада
   '\n'  - знак за прелазак у нови ред
   '\f'  - знак  за прелазак на нову страну
   '\t'  - знак табулатора
   '\b'  - знак за повратак на једно место уназад.

Сепаратори[уреди | уреди извор]

Сепаратори су специјални знаци који не означавају операцију, а имају функцију да одвоје одређене логичке целине у коду. За раздвајање Јава користи неколико знакова:

   () (обичне заграде) - Служе за одвајање листе параметара од позива методе. Користе се и за наглашавање приоритета израза, за груписање израза у управљачким наредбама, као и за одређивање типова података при конверзији.
   {} (витичасте заграде) - Служе за ограђивање вредности аутоматски иницијализованих низова, за дефинисање блокова наредби, класа, метода, као и за дефинисање локалног опсега важења променљивих.
   [] (угласте заграде) - Користе се за издвајање вредности чланова низова и за декларисање самих низова.
   ; (тачка са запетом) - Закључује наредбу.
   , (запета) - Раздваја идентификаторе у декларацији променљиве и користи се за повезивање наредби унутар петљи.
   . (тачка) - Служи за раздвајање назива пакета од потпакета и класа, као и за раздвајање променљивих или метода од имена објеката.

Оператори[уреди | уреди извор]

Оператори омогућавају операције над подацима. Подаци на које се примењују оператори називају се операнди. Према позицији у односу на операнде, разликујемо префиксне, инфиксне и постикфне операторе. Међутим, уколико се помоћу оператора додељује вредност или не, можемо да разликујемо две класе оператора: операторе доделе и остале.

  • Аритметички оператори, заједно са операндима и сепараторима служе за формирање аритметичких израза. У аритметичке операторе спадају: + - * / % ++ --
  • Релациони оператори се могу још назвати и операторима поређења и служе за поређење вредности операнада. У релационе операторе спадају: == != < > >= <=
  • Битовни оператор може бити логички или оператор померања. Ту спадају:
   &  - битовна конјукција(AND)
   ~  - битовна негација(NOT)
   |  - битовна дисјункција(OR)
   ^  - битовна ексклузивна дисјункција(XOR)
   <<  - померање (шифтовање) улево
   >>  - померање (шифтовање) удесно
   >>>  - померање (шифтовање) удесно са нулама.
  • Логички оператори се деле на:
   &&  - конјукцију 
   ||  - дисјункцију
   !  - негацију.
  • Условни оператор се најчешће користи у форми:
   <logički_operator>?<prvi_izraz>:<drugi_izraz>
  • Помоћу инстанцног оператора се проверава да ли конкретан примерак припада некој класи, при чему оператор instanceof генерише вредност true ако је објекат примерак наведене класе или интерфејса, а у супротном даје вредност false.
   <instancni_operator>::= instanceof
  • Оператор доделе служи да додели вредност некој променљивој.

Коментари[уреди | уреди извор]

Коментари служе да се објасне поједина места у програму.

  • Једноредни коментари обележавају се са // и завршавају се на крају реда
  • Вишередни коментари обележавају се са /* и завршавају се са */. Ови коментари могу се простирати преко више редова. Не могу бити угнеждени.
  • Коментари за документацију обележавају се са /** и завршавају се са */. Ови коментари могу се простирати преко више редова. Не могу бити угнеждени.

Белине[уреди | уреди извор]

Белина је знак који нема графички приказ на излазном уређају. Служе за међусобно раздвајање елементарних конструкција и за обликовање програма.

Јава објекти и класе[уреди | уреди извор]

Класа је скуп објеката са заједничким својствима, који се понашају на исти начин[7]. Класа се састоји од атрибута и метода.

Атрибути описују особине, а методе понашање класе.

Пакет је група сличних типова класа, интерфејса и под-пакета.

Објекат је примерак класе. Сваки објекат има свој примерак свих поља атрибута, који је независан од осталих објеката, а методе су заједничке за све њих.

Атрибутима објекта се приступа помоћу оператора тачка, нпр. Pera.ime() .

Методе се позивају на следећи начин: Pera.jedi() .

Резервисана реч this је "показивач" на тренутни објекат који се обрађује при позиву методе. Објекти су направљени тако да симулирају понашање спољашњег света и потпуно су одређени својим атрибутима и понашањем.

На пример, класа би била Covek, атрибути ime, prezime, а метод јеdi.

Како би то изгледало у Јави:

public class Object Covek{
        String ime, prezime;
	void jedi{.....}
}

Прављење објеката[уреди | уреди извор]

Сваки објекат би требало да има и своје конструкторе. Конструктори су ти који дефинишу наш објекат и спремају га за коришћење. Њим се иницијализују поља на неке конкретне вредности. Они не смеју да имају повратне вредности и дефинишу се као ImeKlase(parametri).

Пример дефинисања конструктора:

Covek(String ime, String prezime){
         this.ime = ime;
         this.prezime = prezime;	
}

Пример позива конструктора:

  Covek Pera = new Covek(ime, prezime);

Имплицитни конструктори су конструктори који се позивају кад се не зада ниједан параметар при прављењу новог објекта, и он би требало да обезбеди да се поља објекта налазе у неком подразумеваном стању. На пример, за тачку би било подразумевано стање да се налази у координатном почетку.

Енкапсулација је скривање радње унутар класе, јер корисник не мора да зна шта се дешава "испод жита", него само шта дати метод ради, или које он све атрибуте има и чему служе. [8]

Наслеђивање[уреди | уреди извор]

Кључна реч extends се користи за прављење нове класе, која се изводи из неке постојеће. Постојећа класа назива се наткласа или родитељска, а нова класа поткласа или класа дете.[9]

Поткласе имају више функционалности од својих наткласа, нпр. када бисмо у класи Employee дефинисали класу Manager(користећи кључну реч extends), класа Manager би енкапсулирала више података и имала више функционалности од своје наткласе. У класи Manager бисмо додатно дефинисали нпр. поље које чува вредност бонуса, као и методу setBonus за подешавање његове вредности. Ако смо инстанцирали објекат класе Manager, можемо употребити и методу setBonus. Међутим, уколико смо инстанцирали објекат класе Еmployee, не можемо употребити методу setBonus - ова метода се не налази међу методама које су дефинисане у класи Employee. Међутим, методе које су дефинисане у класи Еmployee, могу се користити са објектима класе Manager. Мада те методе нису експлицитно дефинисане у класи Manager, оне се аутоматски наслеђују из наткласе Еmployee. Исто важи и за поља дефинисана у наткласи, сваки објекат класе Manager има поља дефинисана у наткласи Еmployee. У суштини, кад се дефинише поткласа извођењем из њене наткласе, треба само уочити разлику између поткласе и наткласе. Најопштије методе треба стављати у наткласе, а специфичније методе, које су више специјализоване, треба смештати у поткласе.

Генерално, издвајање опште функционалности њеним померањем у наткласе је уобичајено за објектно оријентисано програмирање. Међутим, метода класе Manager нема директан приступ приватним пољима наткласе. Уколико методе класе Manager желе да приступе тим приватним пољима, оне морају да користе јавне методе класе Еmployee. Да бисмо назначили да желимо да позовемо методу наткласе, а не текуће класе, користимо специјалну реч super.

Наслеђивање не треба да се заустави на извођењу само једног нивоа класа. На пример, можемо имати класу Executive која наслеђује класу Manager.

Колекција свих класа које су настале наслеђивањем заједничке наткласе назива се хијерархија наслеђивања. Чињеница да променљива објекта може да показује на више стварних типова назива се полиморфизам.

Променљива типа Еmployee може да се односи на објекат типа Еmployee, или на објекат било које поткласе класе Еmployee, као што су Manager, Еxecutive...

У случају да желимо да спречимо да неко други формира поткласу од неке наше класе, у дефиницији такве класе користимо модификатор final. Слично, коришћењем истог модификатора можемо да учинимо неку конкретну методу у класи коначном. Модификатор final користимо како бисмо осигурали да се понашање не може променити у поткласи.

Док се крећемо ка врху кроз хијерархију наслеђивања, класе постају све општије и вероватно све апстрактније. Класа са једном или више апстрактних метода мора и сама да се декларише као апстрактна, што се ради коришћењем кључне речи abstract. Поред апстрактних метода, апстрактне класе могу имати конкретне податке и методе. Апстрактне методе се понашају као чувари места за методе, које су имплементиране у одређеној поткласи. Апстрактне методе представљау важан концепт у програмском језику Јава, а на њих често можете наићи унутар интерфејса.

Интерфејс је референтни тип, сличан класи, али може садржати само константе и потписе метода. Од верзије 8 интерфејси могу да садрже и тела метода.

Служе да се обезбеди неки шаблон понашања, којим гарантујемо да објекат који га укључује мора да има дато извршавање наведено у интерфејсу. Класа може да укључи више интерфејса.[10]

Пример:

interface Moveable{
 public move();//potpis metode
   }


public class Covek implements Moveable{
 .....
 move(){...}
   }

Поља у класи је најбоље означити као private, док се методе обично означавају као public. Све карактеристике које су дефинисане као private нису видљиве за друге класе. То исто важи и за поткласе.

Постоје и ситуације кад методу желите да ограничите само на поткласе и тада да допустите методама поткласе да приступе пољу наткласе. Тада се поље или метода декларише као protected.

Модификатори у Јави који контролишу видљивост:

  • private - видљив само за одређену класу
  • public - видљив за цео свет
  • protected - видљив за одређени пакет и све поткласе
  • уколико изоставимо модификатор, биће подразумевано да је видљиво у класи и у пакету.[11]

Референце[уреди | уреди извор]

Спољашње везе[уреди | уреди извор]

Sun[уреди | уреди извор]

Алтернативе[уреди | уреди извор]

Упутства за почетнике[уреди | уреди извор]

Извори[уреди | уреди извор]

Историја[уреди | уреди извор]

Критике[уреди | уреди извор]