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:

  1. Pachetul java.applet contine clase folosite pentru a crea apleturi Java si pentru a lucra cu ele. Fiecare aplet este derivat direct din clasa java.applet.Applet din acest pachet.
  2. Pachetul java.awt contine clasele si subpachetele care alcatuiesc Java Abstract Windowing Toolkit (AWT). Acest pachet furnizeaza principalele clase care permit unei aplicatii GUI (Graphical User Interface) scrise in Java sa ruleze pe orice platforma. Cateva exemple de clase incluse in pachetul java.awt sunt: Button, List, Menu, CheckBox, Color, Font, Graphics, Image, Point, Rectangle, Polygon, Window etc.
  3. Pachetul java.io contine clase cu capacitati de intrare/iesire. Programatorul poate citi de la intrarea standard sau scrie la iesirea standard: File, FileInputStream, FileOutputStream, DataInputStream etc.
  4. Pachetul java.lang contine clasele care corespund tipurilor de date de baza (Integer, Boolean, Float, Character, Long, Double). In acelasi pachet sunt incluse si clasele System ( furnizeaza informatii ale sistemului unde ruleaza) si Thread (furnizeaza posibilitatea crearii mai multor fire de executie);
  5. Pachetul java.net include clase pentru comunicatii intre procese pe masini diferite (dintr-o retea de calculatoare). Clasele URL, URLConnection, Socket, InetAddress sunt cateva exemple.
  6. Pachetul java.util ofera un mare numar de clase utile ca: Date, Dictionary, Hashtable, Stack, Vector etc.
1