Java (programski jezik)

**Java** je objektno-orijentirani programski jezik razvijen u timu predvođenim Jamesom Goslingom u kompaniji Sun Microsystems početkom 1990-tih. Ideja je bila da se stvori programski jezik koji bi bio nezavisan od operativnog sistema, baziran na C++-u, ali sa pojednostavljenom sintaksom, stabilnijim *runtime* sistemom i pojednostavljenom kontrolom memorije.

Java nema veze sa JavaScriptom, iako oba jezika koriste sličnu sintaksu baziranu na C sintaksi.

## Historija 
## Filozofija 
Pet osnovnih razloga za razvoj Jave su:

# treba da koristi objektno orijentisane metodologije
# treba da se isti program izvršava na mnogim operativnim sistemima
# treba da sadrži (built-in) podršku za računarske mreže
# treba da izvrši programe sa (geografski) udaljenih servera sa sigurnošću
# treba da bude jednostavan za upotrebu i da posudi korisne stvari od starijih objektno orijentisanih jezika, poput C++.

Da bi postigli mrežnu podršku i izvršavanje programa na udaljenim serverima, Java programeri ponekad moraju koristiti dodatke poput CORBA ili OSGi.

### Objektno orijentiranje 
Osnovni koncept u Javi je klasa (), tj. sav izvorni kod je napisan unutar klasa. U pravilu, svaka klasa je deklarirana unutar datoteke sa istim imenom i sufiksom **.java**. Ovo pravilo je donekle nametnuto kompajlerom koji zahtijeva da su imena klasa i datoteka ista (osim tzv. **unutrašnjih klasa**, ).
Osnovni tipovi u Javi, poput `int`, `boolean`, `byte` i sl. su također predstavljeni u klasama (*napomena: Reflection types*) i imaju odgovarajuće klasne omote poput `java.lang.Integer`, `java.lang.Boolean` i `java.lang.Byte`.

### Nezavisnost od platforme (operativnog sistema) 
Javin izvorni kod nije kompajliran u mašinski kod nego je pretvoren u tzv. *bytecode* koji zahtijeva posebno okruženje da bi se mogao izvršavati. To okruženje se u ovom slučaju zove Javina virtualna mašina (engl. Java Virtual Machine ili JVM). Trenutno JVM podržava najrasprostranjenije operativne sisteme, mada ne sve. Ideja je da ako se kod napiše i kompajlira na jednoj platformi (npr. Mac OS X), taj isti *bytecode* se može izvršavati na svim ostalim platformama koje imaju JVM (npr. Microsoft Windows XP, Linux) bez potrebe za ponovnim kompajliranjem na toj platformi.

### Automatsko čišćenje resursa (*garbage collection*) 
U Javi, za razliku od npr. C++-a, memorija namijenjena objektu je automatski počišćena, tj. vraćena sistemu čim se taj objekat više ne koristi (za tog objekta kažemo da je van domašaja ili ). To nije slučaj u C++-u gdje svaki objekat koji je stvoren mora biti ručno izbrisan koristeći uputu `delete` (ako se to ne uradi onda dođe do tzv. curenja memorije ili ).

## Sintaksa 
Iako je Java nastala od C++, ali za razliku od C++, koji dozvoljava struktuirane kao i objektno orijentirane principe, u Javi su objektno orijentirani principi obavezni. Sve je u Javi objekat, a sav izvorni kod je pisan unutar klasa.

### Vozdra Raja (Hello World) primjer 
#### Aplikacija 
```java
// VozdraRaja.java
 public class VozdraRaja {
     public static void main(String[] args) {
         System.out.println("Hello world!"); 
     } 
 }
```

* Sve u Javi je uvijek upisano unutar klase, pa čak i glavna aplikacija.
* Konvencija za nazive Java datoteke je da imaju isto ime kao i klasa koju sadrže sa obaveznim sufiksom ".java".
* Kompajler će generirati class datoteku za svaku klasu definiranu u datoteci sa izvornim kodom. Ime generirane datoteke je ime klase sa .class sufiksom. Tako npr. za klasu `VozdraRaja` koja je deklarirana u datoteci `VozdraRaja.java`, kompajler će stvoriti class datoteku sa nazivom VozdraRaja.class. U slučaju nepoznate (anonimne) klase, generirana datoteka će imati ime klase koja sadrži nepoznatu klasu, zajedno sa simbolom $ i brojem. Npr. `VozdraRaja$1.class`.
* Klase koje pokreću program moraju imati metodu `main()`, tzv. **glavnu** metodu.
* Uputa `void` označava da metoda `main()` ne vraća ništa.
* `main()` metoda mora uzimati niz *String* objekata kao parametar. Obično se taj parametar imenuje `args`, međutim bilo koje dozvoljeno ime varijable se može koristiti kao parametar (npr. `argumenti`).
* Uputa `static` označava da je ova metoda **statična** tzv. metoda na nivou klase, umjesto uobičajenog nivoa objekta (instance). Glavna metoda mora biti označena `static`.
* Uputa `public` (javna) označava da se ta metoda može zvati iz koda u drugim klasama ili da se ta klasa može koristiti u drugim klasama izvan hierarhije te klase.
* Printing funkcija je standardni dio Jave, tj. `java.lang.System` definira javnu staticnu (public static) varijablu `out` koja je instanca (objekat) klase `java.io.PrintStream` i ima metodu `[println(java.lang.String)](http://java.sun.com/j2se/1.5.0/docs/api/java/io/PrintStream.html#println(java.lang.String))` koja ispisuje informaciju na ekranu (tzv. standardni output).
* Java izvorni kod se kompajlira koristeći `javac` program, tj. pozivajući Java kompajler. Npr. da bi kompajlirali gore navedeni primjer u trenutačnom direktoriju
:UNIX, Linux i Mac OS X

```
$ javac VozdraRaja.java
```

:Windows

```
C:\> javac VozdraRaja.java
```

* Samostalni programi u Javi se izvršavaju tako da se Javinoj runtime (JRE) pripiše ime klase koja sadrži `main()` (glavnu) metodu koja se automatski poziva. Npr. gore spomenuti program se pokreće na sljedeći način (ako je VozdraRaja.java kompajliran u trenutnom direktoriju)
:UNIX, Linux i Mac OS X

```
$ java -cp . VozdraRaja
```

:Windows

```
C:\> java -cp . VozdraRaja
```

Ime klase koja sadrži glavnu metodu koja se pokreće može se također deklarisati u META-INF/MANIFEST.MF datoteci u Java arhivi, tj. JAR fajlu.

### Applet 
Java apleti (applets) su (obično mali) programi koji su uključeni unutar drugih aplikacija, obično web stranice prikazane (i izvršavane) unutar browsera.

```java
// VozdraRaja.java applet
import java.applet.Applet;
import java.awt.Graphics;

public class VozdraRaja extends Applet {
    public void paint(Graphics gc) {
        gc.drawString("Vozdra raja, nema Hello world!", 65, 95);
    }
}
```

```html5

  
    Vozdra Raja Applet Primjer
  
  
    
    
  

```

* Uputa `import` upućuje kompajler da uključi `java.applet.Applet` i `java.awt.Graphics` klase u kompilaciju. Koristeći `import` uputu programer može koristiti normalizirano (skraćeno) ime klase (npr. `Applet`) umjesto čitavog imena (npr. `java.applet.Applet`) u svom izvornom kodu.
* `VozdraRaja` klasa proširuje klasu `Applet`, tj. `Applet` daje osnovnu okosnicu aplikaciji za prikazivanje i kontrolu tokom rada apleta. `Applet` klasa je komponenta *Abstract Windowing Toolkit* (AWT), koji daje apletu mogućnost da se prikaže u korisnikovom grafičkom interfejsu (tj. *GUI*) i reaguje na GUI događaje (poput klika na dugme).
* `VozdraRaja` *overrides* (termin koji opisuje da metoda u **ovoj** klasi ima prednost nad roditeljskom klasom) `paint(Graphics)` metodu nasliđenu od `Container` *super-klase* koja, daje, tj. sadrži kod za prikazivanje apleta. Metoda `paint()` uzima `Graphics` objekat kao parametar koji sadrži grafički kontekst unutuar kojeg se prikazuje aplet. Tako npr. `paint()` poziva metodu `drawString(String, int, int)` unutar grafičkog kontexta da prikaže "Vozdra raja, nema Hello world!" počevši na piksel koordinatama 65 i 95 u apletovom prostoru.
* Aplet se stavlja u HTML dokument koristeći  HTML elemenat (tj. tag). Također postoje tri atributa koji se mogu postaviti
:* `code="VozdraRaja"` - naznačuje ime klase koju treba izvrsiti
:* `width="200"` - znači **širina**, tj. širina apletovog prostora
:* `height="200"` - znači **visina**, tj. visina apletovog prostora

* Apleti se također mogu dodati HTML-u koristeći `object` ili `embeded` elemente (tj. tagove), mada podrška za ove element varira ovisno o internet pregledniku. http://java.sun.com/docs/books/tutorial/deployment/applet/applettag.html http://java.sun.com/docs/books/tutorial/deployment/applet/mixedbrowser.html )

## Također pogledajte 
* Primjer u Javi
* Programska paradigma
* Objektno orijentirano programiranje
* Full Java Tutorial

Kategorija:Programski jezici
Kategorija:Američki izumi