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

Из Википедије, слободне енциклопедије
Ed NL icon.png
Овај чланак је део пројекта семинарских радова на Математичком факултету у Београду.
Датум уноса: октобар—децембар 2017.
Википедијанци: Ова група студената ће уређивати у ГИП-у и молимо вас да не пребацујете овај чланак у друге именске просторе Википедије.
Позивамо вас да помогнете студентима при уређивању и допринесете да њихови уноси буду што квалитетнији.
Јава
Java logo.gif
Лого програмског језика Јава
Оригинални назив енгл. Java
Изговара се јава
Модел структурирани, објектно-оријентисани
Појавио се 1995.
Аутор(и) Џејмс Гозлинг
Дизајнер(и) Sun Microsystems
Актуелна верзија JDK SE8 Update 111 Beta (build 14)
Типови променљивих статички, јаки, сигурни, номинални
Имплементације многе
Утицаји 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-а, са подједнаком лакоћом као да приступају локалном систему датотека
  • робустан - Јава је намењена за писање програма који морају бити поуздани на много начина. Истиче се у раној провери могућих проблема, каснијој динамичкој провери(током извршавања) и елиминацији ситуација у којима лако долази до појаве грешака
  • безбедан - Јава је намењена коришћењу у мрежним/дистрибуираним окружењима. Према томе, много је труда уложено у безбедност. Омогућава конструкцију система који су заштићени од вируса и злонамерне модификације. Од самог почетка, Јава је пројектована да потпуно онемогући одређене врсте напада, као што су прекорачење извршног стека, приступ меморији изван дела додељеног процесу, читање или уписивање датотека без дозволе...
  • неутралан - компајлер ствара објектну датотеку, чији је формат независан од оперативног система на коме се покреће. Компајлирани код се може извршавати на многим процесорима, под претпоставком присуства извршног система Јава. Јава компајлер остварује ово тако што генерише тзв. бајткод инструкције, које немају никакве везе са архитектуром коришћеног рачунара, већ се подједнако лако интерпретирају на свакој машини, а исто тако лако се преводе и у одговарајући машински код
  • преносив - овде не постоје аспекти који су зависни од имплементације. Величине примитивних типова су фиксне, као и њихово понашање у аритметици. Такође, библиотеке које су део система дефинишу интерфејсе који су преносиви
  • интерпретиран - исти Јава бајткод се може извршавати на сваком компјутеру за који постоји Јава интерпретер. Будући да је линковање постепен и лакши поступак, сам развој може бити бржи
  • перформантан - мада су перформансе преведеног бајткода обично више него довољне, постоје ситуације када су потребне боље перформансе. Бајткод може да буде преведен током извршавања у машински језик
  • вишенитан - предности вишенитне обраде су бољи интерактивни одзиви и понашање у реалном времену
  • динамичан - Јава је пројектована тако да се прилагођава окружењу које се стално унапређује. Библиотеке могу слободно да додају нове методе и поља, без утицаја на клијенте. У Јави је прилично једноставно проналажење информација приликом извршавања програма.

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

  • 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 SE6
  • 2010. Java постаје власништво компаније Oracle [2]
  • 2011. Појављује се Java SE7
  • 2014. Појављује се Java SE 8

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


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

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

Јава се извршава коришћењем Јава виртуелне машине -Ј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 за подешавање његове вредности. Ако смо инстанцирали објекат класе Маnager, можемо употребити и методу setBonus. Међутим, уколико смо инстанцирали објекат класе Еmployee, не можемо употребити методу setBonus - ова метода се не налази међу методама које су дефинисане у класи Employee. Међутим, методе које су дефинисане у класи Еmployee, могу се користити са објектима класе Маnager. Мада те методе нису експлицитно дефинисане у класи Маnager, оне се аутоматски наслеђују из наткласе Еmployee. Исто важи и за поља дефинисана у наткласи, сваки објекат класе Маnager има поља дефинисана у наткласи Еmployee. У суштини, кад се дефинише поткласа извођењем из њене наткласе, треба само уочити разлику између поткласе и наткласе. Најопштије методе треба стављати у наткласе, а специфичније методе, које су више специјализоване, треба смештати у поткласе.

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

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

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

Променљива типа Еmployee може да се односи на објекат типа Еmployee, или на објекат било које поткласе класе Еmployee, као што су Маnager,Е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[уреди]

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

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

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

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

Критике[уреди]