Osnove programskog jezika JAVA |
Tvorac Jave je James Gosling iz Sun Microsistems-a. JAVA je zamišljena kao jednostavan, platformski nezavistan jezik namenjen pokretanju elektroskih uređaja kao što su interaktivna TV, inteligentne rerne, telefoni i slične naprave. Eksplozijom web-a 1994. godine inžinjeri Sun-a ugrađuju Javu u web browser WebRunner, a početkom 1995. objavljuju izvorni kod i dokumentaciju na internetu. Java postaje sve popularniji programski jezik zbog sledećih svojstava:
Objektna orijentacija -- Java je objektno orijentisani jezik koji podržava sve koncepte OO programiranja. Njena sintaksa nalikuje sintaksi C++ jezika, ali su iz nje izbačeni složeni koncepti C++ za koje se smatralo da zbunjuju programere ili prave probleme.
Prenosivost -- Java izvorni programi se prevode u takozvani bajt kod koji nije mašinski jezik nijednog konkretnog računara, već se izvršava na Java Virtuelnoj Mašini (VM). Java Virtuelna Mašina je virtelni računar koji može biti simuliran na bilo kojem računaru. Time je postignuto da Java programi mogu da se izvršavaju na raznim platformama bez potrebe za prepravljanjem.
Prirodna prilagođenost internetu -- Java programi mogu da
se izvršavaju u Web browserima, poseduje sigurnosne mehanizme, njeni delovi
koda mogu u realnom vremenu da se distribuiraju i izvršavaju na različitim
mašinama, podržava konkurentno programiranje i njene predefinisane klase
za korisnički interfejs (API) omogućuju jedinstven izgled i korišćenje
aplikacija.
Lista rezervisanih reči JAVA
jezika
abstract | finally | public |
assert | float | return |
boolean | for | short |
break | goto | static |
byte | if | strictfp |
case | implements | super |
catch | import | switch |
char | instanceof | synchronized |
class | int | this |
const | interface | throw |
continue | long | throws |
default | native | transient |
do | new | true+ |
double | null+ | try |
else | package | void |
extends | private | volatile |
false+ | protected | while |
final |
+ Preciznije false, null, true su lierali, a ne kljucne reci.
Tipovi podataka i operatori |
Java je strogo tipiziran jezik jer zahteva da se za svaki podatak u
svakom trenutku zna kom tipu pripada. Prilikom deklaracije promenljive
obavezno je navesti i njen tip. U Javi postoje dva tipa podatka: prosti
tipovi podataka (int,char,byte,long,float,boolean) i složeni tipovi podataka
(objekti i nizovi). Svaki od prostih tipova podataka ima tačno definisanu
veličinu bez obizira na platformu na kojoj se izvršava Java kod. Detaljne
karakteristike prostih tipova podatka date su u sledećoj tabeli:
Tip
podataka
|
Opis
|
Default
vrednost
|
Veli-
čina
|
Minimalna
vrednost
Maksimalna vrednost
|
boolean
|
Logicki
tip podatka sadrži true ili false
|
False
|
1
bit
|
-
-
|
char
|
Karakter
(Unicode)
|
\u0000
|
16
bita
|
\u0000
\uFFFF
|
byte
|
Ceo
broj
|
0
|
8
bita
|
-128
127
|
short
|
Ceo
broj
|
0
|
16
bita
|
-32768
32767
|
int
|
Ceo
broj
|
0
|
32
bita
|
-2147483648
2147483647
|
long
|
Ceo
broj
|
0
|
64
bita
|
-9223372036854775808
9223372036854775807
|
float
|
Realan
broj sa pokretnim zarezom
|
0.0
|
32
bita
|
+/-1.40239846E-45
+/- 3.40282347E+38
|
double
|
Realan
broj u eksponencijalnom obliku
|
0.0
|
64
bita
|
+/-4.94065645841246544E-324
+/-1.79769313486231570E+308
|
Konverzije tipova
OPERACIJA | JAVA sintaksa |
boolean u String | String s=logprom?"true":"false";
String s=""+logprom; |
byte, short, char, int u String | String s=Byte.toString(bajtprom);
String s=Short.toString(shortprom); String s=Integer.toString(intprom); String s=Integer.toString(broj, osnova); String s=Integer.toBinaryString(broj); String s=Integer.toOctalString(broj); String s=Integer.toHexString(broj); String s=String.valueOf(broj); String s=""+broj; |
long u String | String s=Long.toString(longprom);
String s=Long.toString(longprom, osnova); String s=Long.toBinaryString(longprom); String s=Long.toOctalString(longprom); String s=Long.toHexString(longprom); String s=String.valueOf(lonfprom); String s=""+longprom; |
float u String | String s=Float.toString(pokzarez);
String s=String.valueOf(pokzarez); String s=""+pokzarez; |
double u String | String s=Double.toString(doubleprom);
String s=String.valueOf(doubleprom); String s=""+doubleprom; |
String u boolean | boolean logprom=Boolean.getBoolean(string); |
String u byte | byte b= Byte.parseByte(string);
byte b= Byte.parseByte(string, osnova); |
String u short | short sh= Short.parseShort(string);
short b= Short.parseShort(string, osnova); |
String u int | int d= Integer.parseInt(string);
int d= Integer.parseInt(string, osnova); |
String u long | long ld= Long.parseLong(string);
long ld= Long.parseLong(string, osnova); |
String u char | char c= (char)Integer.parseInt(string);
char c= (char)Integer.parseInt(string, osnova); |
String u float | float f= Float.parseFloat(string); |
String u double | double fd= Double.parseDouble(string); |
String nije primitivan tip podatka u Javi, već je objekat koji pripada klasi String class. Ipak omogućeno je da se string može pojaviti između duplih navodnika (kao u C-u), jer kompajler automatski kreira neophodni String objekat.
U Javi su podržani operatori koji su komplemetarni sa C i C++ operatorima:
Tip operatora | Operator | Opis |
Aritmeticki operatori
|
|
Inkrementiranje
(unarni operator)
|
|
Dekrementiranje
(unarni operator)
|
|
|
Sabiranje
|
|
|
Oduzimanje
|
|
|
Množenje
|
|
|
Deljenje
|
|
|
deljenje
po modulu
|
|
Operatori poredjenja
|
|
Jednakost
|
|
Nejednakost
|
|
|
Manje
od
|
|
|
Veće
od
|
|
|
Manje
ili jednako
|
|
|
Vece
ili jednako
|
|
Logicki
operatori
|
|
Logicko
I
|
|
Logicko
ukljucujuce ILI
|
|
|
Logicko
iskljucujuce ILI
|
|
|
Negacija
|
|
Operatori
za rad sa bitovima
|
|
Bitsko I |
|
Bitsko ILI | |
|
Bitno
iskljucujuce ILI
|
|
|
Pomeranje bitova u levu stranu | |
|
Pomeranje bitova u desnu stranu | |
|
Pomeranje bitova u desnu stranu kao da nema znaka | |
Operatori
dodele vrednosti
|
|
Dodela
vrednosti
|
|
Dodela vrednosi sa primenom aritmeticke operacije | |
Operator za String objekate |
|
Konkatenacija
stringova
|
Operator
objekata
|
|
Operator
za proveru pripadnosti objekta nekoj klasi
|
Često korišćene konstante u JAVA-i
naziv | opis |
Math.E | osnova prirodnog logaritma |
Math.PI | PI |
Float/Double.NEGATIVE_INFINITY | negativno beskonacno |
Float/Double.POSITIVE_INFINITY | pozitivno beskonacno |
Float/Double.NaN | not a number |
Byte/Short/Integer/Long/Float/Double.MAXIMUM_VALUE | maksimalna vrednost tipa podataka |
Byte/Short/Integer/Long/Float/Double.MINIMUM_VALUE | minimalna vrednost tipa podataka |
Kreiranje objekata niza može se izvršiti na dva načina:
Kada se koristi ključna reč new, svi članovi niza inicijalizuju
se automatski ( 0 za numeričke nizove , false
za boolean , '\0'
za karaktere i null za objekte ). Članovima niza može se pristupiti
na sledeći način:
brojevi[1]
= "1" ;
Višedimenzioni nizovi se deklarišu na sledeći način:
int[][]
brojevi = new int[10][10] ;
U Javi se koriste sledeće upravljacke strukture :
}
if , else - ključne reči
izraz - može biti tačan ili netačan
uslovne_naredbe - izvršavaju se ako je izraz tačan
uslovne_naredbe_2
-
izvršavaju se kada je izraznetačan
Sintaksa naredbe switch :
switch ( promenljiva ) {
case (vrednost1) :
uslovne_naredbe
break ;
case (vrednost2) :
uslovne_naredbe
break ;
. . .
default :
uslovne_naredbe
}
Ključne reči ove naredbe su:
switch - identifikuje promenljivu na osnovu koje program odlučuje kuda dalje da krene
case - označava početak svake grane
break - obeležava kraj svake grane
default
-
putanja kojom program kreće ukoliko promenljiva naredbe switch ne
odgovara nijednoj od vrednosti case
.
Promenljiva u naredbi switch mora imati jedan od sledećih
tipova podataka char, int, short
ili byte.
Ciklusi (petlje) u Javi su kao i u C - jeziku for , while,
i do while.
Sintaksa for ciklusa:
for ( inicijalizacija ;izraz ; inkrement )
{
naredbe_petlje
}
inicijalizacija - postavlja početnu vrednost izraza
izraz - testira se na početku svakog prolaza kroz petlju
inkrement
-
izvršava se na kraju svakog prolaza kroz petlju.
Sintaksa naredbe while:
while ( izraz ) {
naredbe_petlje
}
izraz - testira se na početku svakog prolaza kroz petlju
naredbe_petlje
-
izvršavaju se ako je izraz tačan.
Sintaksa do/while ciklusa:
do {
naredbe petlje
}
while (izraz);
naredbe petlje - izvršavaju se sigurno jedanput i svaki sledeći za koji je izraz tačan.
izraz - testira se posle prvog a pre svakog novog ulaska u petlju
Sintaksa naredbe
try/catch/finally:
try {
// izvršne_naredbe
}
catch(NekiIzuzetak e) {
// naredbe_za_obradu
}
finally {
// izvršne_naredbe_2;
}
try -grupa naredbi koja u kojima se može pojaviti izuzetak ili abnormanli prekid (break, continue)
catch --Označava početak obrade izuzetka koji je tipa NekiIzuzetak ili podklase tog tipa
finally
-- Naredbe koje se izvršavaju
bez obira na to da li je došlo do pojave izuzetka ili je normalno izvršena
grupa naredbi u try.
U Javi je moguće imati više objekata iste vrste koji imaju neke zajedničke
osobine. Koristeći tu činjenicu mogu se kreirati šabloni za ovakve objekte.
Ovi šabloni zovu se klase. Dakle klasa predstavlja kolekciju podataka i
metoda (procedura I funkcija) koje manipulišu sa tim podacima.
Primer klase Krug:
public
class Krug {
/* Deklaracija promenljivih */
public double x,y; // kordinate centra
public double r; // poluprecnik kruga
/* Konstruktori */
public Krug(double x, double y, double r) {
this.x = x; this.y = y; this.r = r;
}
public
Krug() {(this(0.0, 0.0, 1.0) }
/* Metode za obim i povrsinu kruga */
public double obim() { return 2 * pi * r; }
public
double povrsina() { return pi * r*r; }
}
Deklaracija klase vrši se ključnom reči class,
kao u sledećem primeru:
public class Krug {
// telo klase
}
Telo klase sastoji se iz deklaracije promenljivih, konstruktora i
metoda.
Modifikatori jezika JAVA
MODIFIKATOR | OPIS |
abstract | Za metode i klase. Definicija se mora obezbediti u nekoj NEapstraktnoj klasi. Ne mogu se kreirati instance apstraktne klase. |
final | Za promenljive, metode, klase. Kod promenljivih vrednost se ne menja. Metode ne mogu biti redefinisane. Za klase se ne kreiraju podklase. |
native | Za metode. Metod je definisan van Java-e. |
none | Za metode, klase, inicijalizatore. Vidljivpst iz paketa u kome su deklarisane. |
private | Za polja, metode, unutar klase. Vidljivost iz svih instanci definisane klase. |
protected | Za polja, metode, klase. Vidljivost iz paketa u kom su deklarisane i podklasa. |
public | Za polja, metode, interfejse, klase. Vidljivost svuda. |
static | Za polja, metode, unutrasnje klase, inicijalizatore. Definicija jednom za sve instance klase. |
strictfp | Za metode i klase.Skracivanje medjuvrednosti nalik starijim JAVA verzijama. |
synchronized | Za metode. Dve niti ne mogu simultano da izvrsavaju metod, razlicito zakljucavanje staticnih i nestaticnih metoda. |
transient | Za polja.Koristi se u kombinaciji sa serijalizacijom za obezbedjivanje istrajnih objekata koji moi biti sacuvani na HD i ponovo postavljeni na drugi disk ili racunar. |
volatile | Za promenljive.Vrednost se moze menjati nezavisno od Java programa, kompajler ne prati njene promene. |
Deklaracija promenljivih sadrži tip ili ime klase, ime koje se koristi
za određenu promenljivu i izraz kojim se dodeljuje početna vrednost ( nije
obavezan ).
Većina promenljivih pripada određenom objektu. To znači da svaki
objekat koji se zasniva na šablonu klase može da ima različitu vrednost
za istu promenljivu.
int
broj ;
Svi objekti zasnovani na šablonu klase dele jednu kopiju promenljive
klase. Promenljive klase deklarišu se ključnom rečju static:
static
int brojac = 1 ;
Ključna reč final se koristi za definisanje konstante:
final int MAX = 10; // za objekat
static
final float pi = 3.14159; // za klasu
Lokalne promenljive se koriste unutar metoda gde se i definišu.
Sintaksa konstruktora:
imeKlase (tip parametar1,tip parametar2,...) {
naredbe ;
}
naredbe;
}
Klasa može imati više metoda istog imena, ali se one razlikuju po broju argumenata, redosledu argumenta i/ili tipu podataka argumenta. Mogućnost definisanja metoda istog imena naziva se "overloading". Objekat poziva metodu svoje klase na sledeći način, takozvanom "dot" sintaksom:
imeObjekta.imeMetode(parametri) ;
JAVA manipuliše objektima preko reference, tj. JAVA radi sa referencama objekata. Kada se objekat prosledjuje nekoj metodi samo se prenosi referenca na objekat. Razlika između primitivnih tipova koje se prenose preko vrednosti i objekata i nizova koji se prenose preko reference je veoma bitna:
public
(javno)
|
svima
vidljivo
|
private
(privatno)
|
nije
vidljivo nikom
|
protected
(zaštićeno)
|
vidljivo
prilikom nasleđivanja i svima iz iste datoteke ili paketa
|
(bez
deklaracije)
|
vidljivo
svima iz iste datoteke ili paketa
|
public class Kvadrat extends Pravougaonik
Ukoliko
se u subklasi definiše metoda sa istim imenom, povratnom vredšnoću i argumentima
kao i metoda superklase tada se ovom metodom prepisuje "overriding" metoda
superklase.
public abstract double povrsina();
public Color dajBoju () {
return c.getForeground() ;
}
...
}
Nekoliko pravila važi za apstraktne metode i apstraktne klase:
Primer:
class Krug extends GeometrijskiOblik implemets Crtanje {
public double obim() { return 2 * pi * r; }
public
double povrsina() { return pi * r*r; }
// implemetacija metoda interfesa
public void postaviBoju (Color c) { this.c = c; }
public void isrctaj(DrawWindow dw) {
... //telo metode
}
}
Neka podklasa se može implementirati preko više interfejsa čime je omogućeno višestruko nasleđivanje. Za interfejse važe ista pravila nasleđivanja kao i za klase.
Garbage collection automatski oslobađa memoriju koju koristi objekat
ali objekat može da drži i druge resurse kao što su soketi, datoteke itd.
koje je potrebno osloboditi. Za to se koristi metoda finalize() moja mora
biti, ne-statička, bez argumenata i bez povratnih podataka.
Obrada izuzetaka se ostvaruje preko klauzule try/catch/finally. Sa try se označava grupa naredbi za kojima se obrađuje greška. Iza klauzule try može se nalaziti jedna ili više catch naredbi kojima se obrađuje specifican tip izuzetka. Iza catch klauzule se nalazi finally koja generalno služi za oslobađanje resursa, zatvaranje datoteka itd. Naredbe u klauzuli finally se izvršavaju bez obzira na to da je došlo do pojave greške ili je normalno završena grupa naredbi.
Definisanje izuzetka:
}
Pokretanje izuzetka:
package mojPaket ;
Nakon što su klase napisane i spakovane, mogu se pozvati u drugim paketima uz pomoć naredbe import. Naredba import se piše odmah posle naziva paketa a pre bilo koje definicije klase u paketu i može imati dva izgleda:
import paket.klasa; //koriscenje samo konkretne klase
Import naredba koja je implicitna (ne mora se navoditi) i koja postoji u svakom Java programu je :
Signatura main() metode je:
public static void main(String args[])
public - može se pozvati od strane bilo kog objekta
static - znači da je main() metoda klase
void - da ne vraća nikakvu vrednost
String args[ ] - argument komandne linije.
Primer apleta:
import java.applet.*;
import java.awt.*;
public class HelloWorld extends Applet {
Label helloLabel=new Label("Zdravo !");
public void init() {
setBackground(Color.yellow);
add(helloLabel);
}
}
Primer aplikacije:
public class Hello {
public static void main ( String args [] ){
System.out.println("Zdravo !");
}
}
Applet, Label, Color, System - klase koje su već napisane i nalaze se u Java biblioteci ( Java ima velikih broj ovakvih klasa )
setBackground() , add() - metode klase Applet
init() - ovaj metod definiše radnje koje aplet preduzima čim se inicijalizuje.
Program napisan na jeziku Java predstavlja izvorni kod i čuva se u datotekama sa nastavkom .java. Tako bi ova dva programa sačuvali pod nazivom HelloWorld.java i Hello.java.
Kad je izvorni kod gotov predajemo ga računarskom programu - javac (Java prevodilac) koji pravi novu verziju programa ( tzv. bytecod ) i smešta ga u datoteku sa nastavkom .class. Dakle, sa
javac HelloWorld.java
javac Hello.java
formiraju se bajtkodovi: HelloWorld.class i Hello.class.
Za pokretanje aplikacije u komandnoj liniji se navodi komanda java i ime aplikacije. U ovom primeru to bi izgledalo ovako:
Nakon toga na ekranu se ispisuje:
Zdravo !
Za pokretanje apleta potrebno je da se aplet priključi na određenu Web stranu koja se čuva sa nastavkom .html. Pretpostavimo da smo naš aplet priključili Web strani sa nazivom HelloWorld.html. Tada aplet možemo pokrenuti na dva načina: pokretanjem Web čitača (time gledamo celu Web stranu) ili unošenjem sledeće komande:
appletviewer HelloWorld.html