Apleturi Java
2. Programarea orientata pe obiecte in Java
Limbajul Java a fost construit de firma Sun pornind de la limbajul C++, dar
au fost indepartate unele aspecte din C++, precum supraincarcarea operatorilor
si mostenirea multipla. De asemenea, pointerii lipsesc complet din limbajul
Java, eliminandu-se astfel una din principalele surse de erori. In plus, eliberarea
memoriei ocupate de obiecte si masive se face automat, printr-un "mecanism
de colectare de gunoaie". Limbajul Java mai are inclus un suport pentru
aplicatii care lucreaza cu mai multe fire de executie, inclusiv primitive de
sincronizare intre firele de executie.
Limbajul Java lucreaza folosind setul de caractere Unicode. Acesta este un standard
international al carui set de caractere este reprezentat pe 16 biti. Vechiul
standard ASCII este un subset al standardului Unicode, adica vom regasi aici
caracterele ASCII cu exact aceleasi coduri. Diferenta majora este ca o variabila
Java de tip caracter, de exemplu, este reprezentata pe 16 biti, iar un sir de
caractere va ocupa de doua ori mai multa memorie decat numarul caracterelor.
Analog, o variabila de tip intreg, care in C era reprezentata pe 16 biti, acum
va fi reprezentata pe 32 de biti. Avantajul setului Unicode este ca, fiind reprezentat
pe 16 biti, are posibilitati mult mai mari.
Spre deosebire de alte limbaje orientate pe obiecte (de ex. C++), in Java fiecare
linie de cod apartine unei clase. Alfel spus, un program sursa Java este format
numai din clase si interfete.
Pentru ca un program scris in Java sa devina functionabil, trebuie sa fie mai
intai compilat si apoi interpretat. Un program sursa are extensia .java.
Numele sau trebuie sa fie identic cu numele clasei sau interfetei publice declarate
in interiorul sursei. In urma compilarii rezulta fisiere cu nume identice cu
numele claselor, dar cu extensia .class,
indiferent daca este vorba de o clasa sau o interfata (vor fi create atatea
fisiere .class
cate clase si interfete sunt definite in fisierul sursa).
Odata fisierele compilate, acestea pot rula ca aplicatii sau apleturi. O aplicatie
este un program care va fi rulat de sine-statator, cu ajutorul unui interpretor
(java sau jview). Un aplet Java ruleaza intr-un document HTML si fisierele compilate
.class
sunt interpretate de Java Virtual Machine. Acesta este un software care sta
pe masina unde fisierele compilate .class
vor fi rulate (JVM este instalat odata cu instalarea browserului de web).
Sintaxa folosita pentru a crea o noua clasa in Java este:
modificator class numeclasa [extends clasaparinte] [implements interfete]
modificator poate fi unul din urmatoarele
cuvinte cheie:
public – o clasa declarata public
poate fi folosita de orice obiect. De retinut ca un fisier sursa .java
poate avea o singura clasa publica. Numele fisierului sursa trebuie sa fie identic
cu numele clasei publice;
private – o clasa declarata private
poate fi folosita numai de clase din acelasi fisier sursa. O sursa .java
poate contine numai o clasa publica, dar mai multe clase private;
<nimic> - daca nu este specificat nici
un modificator, clasa va fi considerata "friendly" (prietenoasa)
(a nu se confunda cu clasele sau functiile friend din C++!), ceea ce
inseamna ca toate celelalte clase din acelasi pachet pot accesa clasa respectiva;
synchronizable – este folosit pentru a sincroniza
elementele;
abstract – o clasa abstracta contine
numai metode fara implementare (corpul functiei nu este definit aici) si este
folosita drept clasa de baza pentru eventuale clase care deriva din ea;
final – o clasa finala nu poate fi
mostenita (alte clase pot accesa clasa finala, dar nici o alta clasa nu poate
deriva din ea).
Urmatorul exemplu arata o clasa publica si una privata care pot fi create in
acelasi fisier sursa:
Public class clasa1 {
int
x;
MetodaX(int
x);
}
private class clasa2 {
int
y;
MetodaY(int
y);
}
Asa cum clasele pot fi declarate folosind modificatorii descrisi mai sus, Java
permite si ca variabilele si metodele sa fie prefixate de unul din urmatorii
modificatori:
public – o metoda sau variabila declarata
public poate fi accesata de orice clasa;
protected – poate fi accesata numai de subclase;
private – poate fi accesata numai de metode
din aceeasi clasa;
<nimic> - daca nu este specificat nici
un modificator, metoda sau variabila poate fi accesata de orice alta clasa din
acelasi pachet;
static – specifica o metoda sau variabila
valabila global pentru toate instantele unei clase;
native – denota o metoda implementata in
alt limbaj de programare (de ex. C++)
final – specifica o variabila constanta (valoarea
ei nu poate fi schimbata in momentul rularii) sau o metoda care nu poate fi
supraincarcata de o clasa derivata.
synchronized – acest cuvant cheie blocheaza
obiectul atunci cand aceasta metoda este apelata si il deblocheaza atunci cand
se iese din metoda.
In Java mostenirea se realizeaza prin folosirea cuvantului cheie extends.
Astfel, clasa derivata va "mosteni" toate variabilele si metodele
definite in clasa de baza si va adauga variabile si metode specifice.
Spre deosebire de limbajul C++, in Java o clasa poate mosteni numai o singura
clasa. Java permite extinderea acestei functionalitati prin intermediul interfetelor.
O interfata este o declaratie a unui set de metode care nu sunt implementate.
O clasa implemeteaza o interfata prin cuvantul cheie implements
si este responsabila pentru scrierea codului metodelor definite in interfata.
O interfata poate deriva din una sau mai multe interfete. Desi o clasa poate
mosteni o singura clasa, ea poate implementa oricate interfete.
Exemplu de derivare a unei clase folosind mostenirea si implementarea:
Sa presupunem clasa de baza om
si interfata comportament,
definite astfel:
public class om {
int anul_nasterii;
char sex;
int returneaza_varsta(int anul_nasterii) {
cod…
};
}
public interface comportament {
void citeste();
void mananca();
void danseaza();
}
Sa derivam clasa student
din clasa om
si sa implementam interfata comportament:
public class student extends om implements comportament{
String facultatea;
int anul;
int note[20];
int calculeaza_media(int note[]){cod…};
void citeste(){
corpul_functiei_citeste;
}
void mananca(){
corpul_functiei_mananca;
}
void danseaza();{
corpul_functiei_danseaza;
}
}
Mai multe clase si interfete care au ceva in comun pot fi grupate intr-un pachet
(package) adaugand urmatoarea linie la inceputul fiecarui fisier sursa:
package nume_pachet;
Sa presupunem ca am creat clase si interfete care reprezinta persoane:
class om;
class student;
interface comportament;
class profesor;
class muncitor;
Putem grupa aceste clase si interfete intr-un pachet numit persoana scriind
linia package persoana
la inceputul fiecarui fisier sursa care contine clasele de mai sus.
Realizatorii limbajului Java au creat si un numar mare de pachete (dintre care
enumar: java.applet, java.awt,
java.io,
java.lang,
java.math,
java.net,
java.security,
java.sql,
java.text,
java.util).
Fiecare contine clase si interfete pentru a fi reutilizate de programator. Daca
aveti JDK, in directorul unde l-ati instalat se afla un fisier \lib\classes.zip.
Daca ati instalat Vijual J++, in directorul c:\windows\java\classes\java\
veti gasi mai multe directoare. Daca nu ati instalat inca un mediu de dezvoltare
Java, dar aveti un browser cu capacitati Java, de exemplu Internet Explorer
pe un mediu Windows 95/98, uitati-va prin fisierele .zip din directorul c:\windows\java\packages\.
Exista o conventie conform careia numele pachetelor au fost create pe structura
directoarelor. Astfel, pentru a crea subpachetul cu numele java.applet,
a fost creat un director cu numele java,
apoi un subdirector al acestuia cu numele applet.
Toate subpachetele lui applet
se vor afla in directorul applet.
Va recomand ca pe masura ce invatati sa programati in Java, sa va uitati prin
fisierele acestor directoare pentru a intelege structura ierarhica a claselor
si functiile si variabilele definite de fiecare clasa.
Asadar, iata, pe scurt, cate ceva despre cateva dintre aceste pachete: