|
|
|
Cod sursa Java -> (compilare) -> Cod de octeti -> (interpretare)
class FirstApp {
public static void main( String args[]) {
System.out.println("Hello world");
}
}
Toate aplicatiile Java contin o clasa principala(primara) în care trebuie sa se gaseasca
metoda main. Clasele aplicatiei se pot gasi fie într-un singur fisier, fie în mai multe.
Se va face în fisiere cu extensia .java
Fiserul care contine codul sursa al clasei primare trebuie sa aiba acelasi nume
cu clasa primara a aplicatiei (clasa care contine metoda main)
Obs: Java face distinctie între literele mari si mici.
C:/java/FirstApp.java Se foloseste compilatorul Java, javac
Apelul compilatorului se face pentru fisierul ce contine clasa principala a aplicatiei.
Compilatorul creeaza câte un fisier separat pentru fiecare clasa a programului;
acestea au extensia .class si sunt plasate în acelasi director cu fisierele sursa.
javac FirstApp.java -> FirstApp.class Se face cu interpretorul java, apelat pentru unitatea de compilare corespunzatoare clasei principale, fiind însa omisa extensia .class asociata acesteia.
java FirstApp
import java.awt.* ;
import java.applet.* ;
public class FirstApplet extends Applet {
Image img;
public void init() {
img = getImage(getCodeBase(), "taz.gif");
}
public void paint (Graphics g) {
g.drawImage(img, 0, 0, this);
g.drawOval(100,0,150,50);
g.drawString("Hello! My name is Taz!", 110, 25);
}
}
javac FirstApplet.java -> FirstApplet.class Applet-urile nu ruleaza independent. Ele pot fi rulate doar prin intermediul unui browser : Internet Explorer, Netscape sau printr-un program special cum ar fi appletviewer-ul din setul JDK.
<html> <head> <title>First Java Applet</title> </head> <body> <applet code=FirstApplet.class width=400 height=400> </applet> </body> </html>
appletviewer exemplu.htmlLimbajului Java lucreaza în mod nativ folosind setul de caractere Unicode. Acesta este un standard international care înlocuieste vechiul set de caractere ASCII si care foloseste pentru reprezentarea caracterelor 2 octeti, ceea ce înseamna ca se pot reprezenta 65536 de semne, spre deosebire de ASCII, unde era posibila reprezentarea a 256 de caractere. Primele 256 caractere Unicode corespund celor din ASCII, referirea la celelate facându-se prin \uxxxx, unde xxxx reprezinta codul caracterului.
\u0030 - \u0039 : cifre ISO-Latin 0 - 9
\u0660 - \u0669 : cifre arabic-indic 0 - 9
\u4e00 - \u9fff : litere din alfabetul Han (Chinez, Japonez, Coreean)
Cuvintele rezervate în Java sunt cele din C++, cu câteva exceptii
Sunt secvente nelimitate de litere si cifre Unicode, începand cu o litera. Identificatorii nu au voie sa fie identici cu cuvintele rezervate.
| Cod | Secventa Escape | Caracter |
|---|---|---|
| \u0008 | '\b' | Backspace(BS) |
| \u0009 | '\t' | Tab orizontal (HT) |
| \u000a | '\n' | Linie noua - linefeed (LF) |
| \u000c | '\f' | Pagina noua - formfeed (FF) |
| \u000d | '\r' | Inceput de rand (CR) |
| \u0022 | '\"' | Ghilimele |
| \u0027 | '\'' | Apostrof |
| \u005c | '\\' | Backslash |
Un separator este un caracter care indica sfârsitul unei unitati lexicale si începutul alteia.
In Java separatorii sunt urmatorii: ( ) { } [ ] ; , .
Instructiunile unui program se separa cu punct si virgula
=
+, -, *, /, % lval op= rval (ex: n += 2) ex: x++, ++x, n--, --n &&(and), ||(or), !(not)
<, <=, >, <=, ==, !=
& (and), |(or), ^(xor), ~(not)
<<, >>, >>> (shift la dreapta fara semn)
if-else: expresie_logica ? val_pt_true : val_pt_false ;
int x=0, y=1, z=2;
String s="abcd" int x=100; System.out.println(s + " - " + x);
(tip_de_data)
int i = 200; long l = (long)i; //widening conversion - conversie prin extensie long l2 = (long)200; int i2 = (int)l2; //narrowing conversion - conversie prin contractie
In Java exista trei feluri de comentarii:
In Java tipurile de date se împart în doua categorii: tipuri primitive de date si tipuri referinta. Java porneste de la premiza ca "orice este un obiect". Asadar tipurile de date ar trebui sa fie de fapt definite de clase si toate variabilele ar trebui sa memoreze de fapt instante ale acestor clase (obiecte). In principiu acest lucru este adevarat, însa, pentru usurinta programarii, mai exista si asa numitele tipurile primitive de date, care sunt cele uzuale :
byte (1 octet), short (2), int (4), long (8)
float (4 octeti), double (8)
char (2 octeti)
boolean (true si false)
pointer, struct si union.
Pointerii au fost eliminati din cauza ca erau o sursa constanta de erori, locul lor fiind luat de tipul referinta,
iar struct si union nu îsi mai au rostul atât timp cât tipurile compuse de date sunt formate în Java prin intermediul claselor.
Variabilele pot avea ca tip fie un tip primitiv de data, fie o referinta la un obiect.
| Declararea variabilelor | Tip nume_variabila
|
| Initializarea variabilelor | Tip nume_variabila = valoare
|
| Declararea constantelor | final Tip nume_variabila
|
Conventia de notare a variabilelor in Java este data de urmatoarele criterii:
final double PI = 3.14; int valoare = 100; long numarElemente = 12345678L; String bauturaMeaPreferata = "apa";
for pentru controlul ciclului, ramân locale corpului ciclului.
for(int i=0; i<100; i++) { }
int i; //ok în Java, eroare în C++
int x=12;
{
int x=96; //ilegal
}
Instructiunile Java pentru controlul executiei sunt asemanatoare celor din C.
| Instructiuni de decizie | if-else, switch-case
|
| Instructiuni de salt | for, while, do-while
|
| Instructiuni pt. tratarea exceptiilor | try-catch-finally, throw
|
| Alte instructiuni | break, continue, label: , return
|
| Instructiuni de decizie | |
if-else
|
if (exp_booleana) { /*...*/}
if (exp_booleana) { /*...*/} else { /*...*/}
|
switch-case
|
switch (variabila) {
case val1 : /* ... */ break;
case val2 : /* ... */ break;
/*...*/
default : /*...*/
}
|
| Instructiuni de salt | |
for
|
for(initializare; exp_booleana; pas_iteratie)
Ex: for(int i=0, j=100 ; i<100 && j>0; i++, j--)
{/* ... /*}
Obs: atât la initializare cât si în pasul de iteratie pot fi mai multe instructiuni despartite prin virgula.
|
while
|
while (exp_booleana) {
/*...*/
}
|
do-while
|
do {
/*...*/
}
while (exp_booleana) ;
|
| Instructiuni pentru tratarea exceptiilor | |
try-catch-finally, throw
| (vezi "Tratarea exceptiilor") |
| Alte instructiuni | |
break
| paraseste fortat corpul iteratiei curente |
continue
| termina fortat iteratia curenta |
return
| return [valoare];Termina o metoda |
label:
| Defineste o eticheta |
Atentie: In Java nu exista goto. Se pot însa defini etichete de forma nume_eticheta:,
folosite în expresii de genul: break nume_eticheata sau
continue nume_eticheta
Exemplu:
i=0;
eticheta:
while (i<10) {
System.out.println("i="+i);
j=0;
while (j<10) {
j++;
if (j==5) continue eticheta;
if (j==7) break eticheta;
System.out.println("j="+j);
}
i++;
}
Crearea unui vector
Tip[] numeVector; sau Tip numeVector[]; Ex: int[] intregi; String adrese[];
numeVector = new Tip[dimensiune]; Ex: v = new int[10]; //se aloca spatiu pentru 10 intregi adrese = new String[100];Obs: declararea si instantierea unui vector pot fi facute simultan astfel:
Tip[] numeVector = new Tip[dimensiune];
Ex: String culori[] = {"Rosu", "Galben", "Verde"};
int []factorial = {1, 1, 2, 6, 24, 120};
Tip numeVector[dimensiune],
alocarea memoriei facându-se doar prin intermediul opearatorului new.
Ex: int v[10]; //ilegal int v[] = new int[10]; //corect
Vectori multidimensionali
In Java tablourile multidimensionale sunt de fapt vectori de vectori.
Ex: int m[][]; //declararea unei matrici m = new int[5][10]; //cu 5 linii, 10 coloaneObs:
m[0], m[1], ..., m[5] sunt vectori de intregi cu 10 elemente
Dimensiunea unui vector
Cu ajutorul cuvântului cheie length se poate afla dimensiunea unui vector.
int []a = new int[5]; a.length are valoarea 5 int m = new int[5][10]; m[0].length are valoarea 10
Copierea vectorilor
Copierea unui vector în alt vector se face cu ajutorul metodei System.arraycopy:
int x[] = {1, 2, 3, 4};
int y[] = new int[4];
System.arraycopy(x,0,y,0,x.length);
Vectori cu dimensiune variabila
Implementarea vectorilor cu numar variabil de elemente este oferita de clasa Vector
din pachetul java.util. Un obiect de tip Vector contine numai elemente de tip Object.
In Java, un sir de caractere poate fi reprezentat printr-un vector format din elemente de tip char, un obiect de tip String sau un obiect de tip StringBuffer.
Declararea unui sir
Daca un sir de caractere este constant atunci el va fi declarat de tipul String,
altfel va fi declarat cu StringBuffer. (vezi "Clasele String, StringBuffer")
Exemple echivalente de declarare a unui sir:
String str = "abc";
char data[] = {'a', 'b', 'c'};
String str = new String(data);
String str = new String("abc");
Concatenarea sirurilor
Concatenarea sirurilor de caractere se face prin intermediul operatorului +.
String str1 = "abc" + "xyz"; String str2 = "123"; String str3 = str1 + str2;In Java, operatorul de concatenare + este extrem de flexibil în sensul ca permite concatenarea sirurilor cu obiecte de orice tip care au o reprezentare de tip sir de caractere.
System.out.print("Vectorul v are" + v.length + " elemente")
O aplicatie Java poate primi oricâte argumente de la linia de comanda în momentul lansarii ei. Aceste argumente sunt utile pentru a permite utilizatorului sa specifice diverse optiuni legate de functionarea aplicatiei sau sa furnizeze anumite date initiale programului.
java Sort persoane.txtAsadar, formatul general pentru lansarea unei aplicatii care primeste argumente de la linia de comanda este:
java NumeAplicatie [arg1 arg2 . . . argn]In cazul în care sunt mai multe, argumentele trebuie separate prin spatii iar daca unul dintre argumente contine spatii, atunci el trebuie pus între ghilimele. Evident, o aplicatie poate sa nu primeasca nici un argument sau poate sa ignore argumentele primite de la linia de comanda.
public static void main ( String args[])Vectorul primit ca parametru de metoda main va contine toate argumentele transmise programului de la linia de comanda. In cazul apelului
java Sort persoane.txt vectorul args va contine
un singur element args[0]="persoane.txt".
numarArgumente = args.length ;Spre deosebire ce C/C++ vectorul primit de metoda main nu contine pe prima pozitie numele aplicatiei, întrucât în Java numele aplicatiei este numele clasei principale, adica a clasei în care se gaseste metoda main.
public class Echo {
public static void main (String[] args) {
for (int i = 0; i < args.length; i++)
System.out.println(args[i]);
}
}
Un apel de genul java Echo Drink Hot Java va produce urmatorul rezultat:
Drink Hot Java(aplicatia Echo a primit 3 argumente).
java Echo "Drink Hot Java" va produce urmatorul rezultat:
Drink Hot Java(aplicatia Echo a primit un singur argument).
Argumente numerice la linia de comanda
Argumentele de la linia de comanda sunt primite sub forma unui vector de siruri (obiecte de tip String).
In cazul în care unele dintre acestea reprezinta valori numerice ele vor trebui convertite din siruri în numere.
Acest lucru se realizeaza cu metode de tipul parseXXX aflate în clasa corespunzatoare
tipului în care vrem sa facem conversia: Integer, Float, Double, etc.
Sa consideram, de exemplu, ca aplicatia Power ridica un numar real la o putere întreaga,
argumentele fiind trimise de la linia de comanda:
java Power "12.1" "3" //ridica 12.1 la puterea 3Conversia celor doua argumente în numere se va face astfel:
double numar; int putere; numar = Double.parseDouble(args[0]); putere = Integer.parseInt(args[1]);Metodele de tipul parseXXX pot produce exceptii (erori) de tipul NumberFormatException în cazul în care sirul primit ca parametru nu reprezinta un numar de tipul respectiv.
|
|
|