17
Java tinde sa devina unul din cele mai mediatizate limbaje de programare realizate vreodata. Motivele? Pe linga o intrare spectaculoasa pe scena, capabilitati pe care alte limbaje nu le-au avut niciodata. Povestea Ideea de a realiza un limbaj ca Java a avut-o James Gosling, conducatorul unui proiect numit Green la care acum cinci ani lucra o echipa de la Sun Microsystems. Initial, echipa nu a avut nici o intentie de a realiza un nou limbaj de programare. Scopul lor era sa realizeze programe pentru controlul aparatelor electronice casnice astfel incit sa poata comunica intre ele. Pentru aceasta, James Gosling si restul echipei au folosit limbajul C++, considerat foarte puternic datorita usurintei lucrului cu obiecte (esential pentru reusita proiectului). Chiar de la inceput insa au aparut foarte multe probleme legate de aspectele mai complicate ale C++, cum ar fi mostenirea multipla si dealocarile dinamice, asa ca Gosling a decis sa realizeze un limbaj simplificat care sa pastreze insa caracteristicile C++. Chiar si in acest stadiu nu s-a gindit nici o clipa ca limbajul sau ar urma sa iasa pe scena limbajelor de programare larg intrebuintate, el dorind doar sa termine proiectul intr-un mod cit mai usor. Dupa ce a eliminat din C++ aspectele care il faceau inadecvat pentru controlul aparatelor electronice a obtinut un limbaj pe care l-a denumit Oak (stejar) -- povestea spune ca Gosling a fost inspirat de un stejar pe care il putea vedea de la fereastra biroului sau --. Oak a fost folosit in proiectul Green, care avea ca scop controlul mai multor aparate (televizor, lumini, telefon, video) cu ajutorul unei telecomenzi numite *7 (StarSeven). *7 era prevazut cu un ecran senzitiv prin intermediul caruia posesorul selecta aparatul de controlat. Controlul era realizat prin intermediul unor figuri animate printre care si Duke, care a ajuns, de altfel, mascota limbajului Java. Pe linga acestea, mai avea citeva caracteristici noi: putea rula multiplatforma si avea facilitati pentru lucrul in retea (ideea era sa poata face dispozitivele sa comunice intre ele - de exemplu, schimb de retete intre cuptorul cu microunde si masina de tocat sau sincronizarea intre telefon si lumini-). Oak a mai fost folosit in cadrul unui proiect ce folosea sistemul Green numit VOD ca baza softului care controla un sistem de televiziune interactiv. Reusita ar fi insemnat foarte multe milioane de dolari. Din pacate pentru VOD si din fericire pentru Web, compania Warner-Time a preferat alt sistem VOD-ului si, pe linga aceasta, un alt contract dintre Sun si 3DO a cazut. Oak a intrat intr-o eclipsa accentuata. Trebuie mentionat ca la inceputul anilor '90 World Wide Web era constituit numai din documente text avind un caracter stiintific. La inceputul anului 1993 insa un eveniment important avea sa schimbe cu totul Reteaua... Mai exact, este vorba de aparitia primului browser grafic pentru WWW, Mosaic 1.0, realizat de Marc Andreesen, un student ce lucra la National Center for Supercomputing Applications (NCSA). Aceasta

Java

Embed Size (px)

DESCRIPTION

Java

Citation preview

Java tinde sa devina unul din cele mai mediatizate limbaje de programare realizate vreodata

Java tinde sa devina unul din cele mai mediatizate limbaje de programare realizate vreodata. Motivele? Pe linga o intrare spectaculoasa pe scena, capabilitati pe care alte limbaje nu le-au avut niciodata. Povestea Ideea de a realiza un limbaj ca Java a avut-o James Gosling, conducatorul unui proiect numit Green la care acum cinci ani lucra o echipa de la Sun Microsystems. Initial, echipa nu a avut nici o intentie de a realiza un nou limbaj de programare. Scopul lor era sa realizeze programe pentru controlul aparatelor electronice casnice astfel incit sa poata comunica intre ele. Pentru aceasta, James Gosling si restul echipei au folosit limbajul C++, considerat foarte puternic datorita usurintei lucrului cu obiecte (esential pentru reusita proiectului). Chiar de la inceput insa au aparut foarte multe probleme legate de aspectele mai complicate ale C++, cum ar fi mostenirea

multipla si dealocarile dinamice, asa ca Gosling a decis sa realizeze un limbaj simplificat care sa pastreze insa caracteristicile C++. Chiar si in acest stadiu nu s-a gindit nici o clipa ca limbajul sau ar urma sa iasa pe scena limbajelor de programare larg intrebuintate, el dorind doar sa termine proiectul intr-un mod cit mai usor. Dupa ce a eliminat din C++ aspectele care il faceau inadecvat pentru controlul aparatelor electronice a obtinut un limbaj pe care l-a denumit Oak (stejar) -- povestea spune ca Gosling a fost inspirat de un stejar pe care il putea vedea de la fereastra biroului sau --. Oak a fost folosit in proiectul Green, care avea ca scop controlul mai multor aparate (televizor, lumini, telefon, video) cu ajutorul unei telecomenzi numite *7 (StarSeven). *7 era prevazut cu un ecran senzitiv prin intermediul caruia posesorul selecta aparatul de controlat. Controlul era realizat prin intermediul unor figuri animate printre care si Duke, care a ajuns, de altfel, mascota limbajului Java. Pe linga acestea, mai avea citeva caracteristici noi: putea rula multiplatforma si avea facilitati pentru lucrul in retea (ideea era sa poata face dispozitivele sa comunice intre ele - de exemplu, schimb de retete intre cuptorul cu microunde si masina de tocat sau sincronizarea intre telefon si lumini-). Oak a mai fost folosit in cadrul unui proiect ce folosea sistemul Green numit VOD ca baza softului care controla un sistem de televiziune interactiv. Reusita ar fi insemnat foarte multe milioane de dolari. Din pacate pentru VOD si din fericire pentru Web, compania Warner-Time a preferat alt sistem VOD-ului si, pe linga aceasta, un alt contract dintre Sun si 3DO a cazut. Oak a intrat intr-o eclipsa accentuata. Trebuie mentionat ca la inceputul anilor '90 World Wide Web era constituit numai din documente text avind un caracter stiintific. La inceputul anului 1993 insa un eveniment important avea sa schimbe cu totul Reteaua... Mai exact, este vorba de aparitia primului browser grafic pentru WWW, Mosaic 1.0, realizat de Marc Andreesen, un student ce lucra la National Center for Supercomputing Applications (NCSA). Aceasta a insemnat o crestere in progresie geometrica a Web-ului, o adevarata explozie de informatie, imagini si sunete. In tot acest timp, Sun incerca sa vinda macar unul din sistemele pentru bucataria de miine pe care le realizasera. Esecul acestei intreprinderi i-a determinat sa caute o alta directie de dezvoltare. La mijlocul anului 1994 au gasit-o: WWW. Au realizat ca limbajul pe care il creasera pentru fierbatorul filozof se potrivea perfect pentru programarea pe Web: era independent de platforma si avea facilitati pentru lucrul in retea. Inca un avantaj pentru Oak : programele puteau fi rulate in siguranta de pe o pagina Web. Echipa a luat un nou avint si a realizat un browser numit WebRunner care readucea pe scena starul proiectului Green : Duke. O problema a aparut in momentul in care Sun a dorit sa isi inregistreze produsele: o alta firma folosea deja numele de Oak. Dupa dezbateri furtunoase, Sun avea sa se opreasca la un nume cu rezonanta exotica, cu aroma de vacanta platita de firma si cu gust de cafea decofeinizata: Java. Cu acest nume charismatic Sun pornea la cucerirea Internetului. WebRunner a fost redenumit HotJava, fiind primul browser ce putea rula cod Java. Pe data de 23 martie 1993 cei de la Sun au cistigat un admirator "greu" : Marc Andreesen, intemeietorul Web-ului asa cum il cunoastem azi. Intre timp, a devenit vicepresedintele companiei Netscape, cu perspective de a calca pe urmele lui Bill Gates in ceea ce priveste averea. Revolutia a inceput. Netscape a cumparat licenta pentru Java, impunindu-l in fata propriilor admiratori. Sun a oferit prima versiune de Java in noiembrie 1995 in versiune beta, apoi un pachet de programe pentru dezvoltarea aplicatiilor, toate gratuit. Toate firmele mari s-au grabit sa cumpere licente Java iar Sun a continuat sa ofere pachete de dezvoltare a programelor Java, eliminind erorile si adaugind noi caracteristici. In scurt timp, reteaua a fost inundata cu aplicatii Java care mai de care mai spectaculoase, articole, surse, manuale si controverse. Dispozitivele casnice nu au devenit mai inteligente cu Oak, in schimb a aparut miracolul unui nou limbaj de programare: Java.

Caracteristicile limbajului Java In esenta Java este un limbaj de programare orientat pe obiecte cu facilitati pentru lucrul pe Internet. Un obiect, in lumea limbajelor de programare reprezinta o unitate care contine atit date (ce pot fi de diferite tipuri) cit si functiile care prelucreaza acele date. Conceptul de obiect a fost introdus pentru a permite o programare mai naturala, mai aproape de notiunea de obiect din lumea reala. Mai concret, sa luam jocul "Doom": in programarea traditionala, fiecare monstru ar fi fost reprezentat in memorie printr-o structura care sa contina caracteristicile sale (pozitie, viata, munitie etc). Pentru a simula miscarea si inteligenta acesta structura trebuia folosita in cadrul unei functii unice, care sa preia fiecare structura si sa o prelucreze. Cu alte cuvinte, functia pentru miscare trebuia sa preia fiecare set de date al monstrilor si sa le actualizeze. Pe ecran ii putem vedea insa distincti, fiecare reprezentind o unitate independenta. E mai natural sa ne gindim ca fiecare monstru are propria functie de miscare, propria inteligenta artificiala (in mod natural, nu ne putem imagina ca impart acelasi set de picioare sau acelasi creier). Devine evident astfel ca fiecare monstru trebuie sa aiba pe linga caracteristicile proprii si propriul set de functii care sa le actualizeze. Abstractizarea in limbaj de programare poarta denumirea de obiect, iar functiile fiecarui obiect se numesc metode. Printre limbajele orientate pe obiecte se numara Pascal, C++, Visual Basic etc. Caracteristica ce deosebeste Java din acest punct de vedere de aceste limbaje este ca totul (sau aproape totul) este un obiect, pina si programul in sine! Java este simplu de invatat si utilizat - eliminarea unor caracteristici ale C++ care conduceau de multe ori la erori - cum ar fi pointerii si gestiunea memoriei - precum si strictetea verificarii tipurilor obiectelor folosite au condus la programe usor de verificat si de mentinut -. Java este independent de platforma- codul Java a fost proiectat sa ruleze pe o masina virtuala Java. Altfel spus, codul masina in care este totdeauna compilat un program Java este pentru un procesor inexistent. Acest cod insa, ajuns pe calculatorul clientului, este tradus in codul nativ al procesorului cu care este dotat. Astfel un programator se asigura ca appletul scris pe calculatorul sau Macintosh va rula fara probleme pe un PC deoarece prin retea se va transmite nu codul calculatorului Mac ci traducerea programului in codul masinii virtuale Java, cod pe care browserul de pe un PC va sti sa il traduca la rindul sau in codul procesorului masinii pe care lucreaza. Java este sigur-Java a fost realizat in principal pentru distribuirea codului pe Internet in cadrul documentelor HTML Asemenea programe inglobate in documente Web se numesc applet-uri. La incarcarea paginii se incarca si appletul iar codul sau este executat. De aceea, echipa de la Sun trebiua sa se asigure ca nici o actiune daunatoare nu ar putea avea loc pe calculatorul utilizatorului: infectari cu virusi, formatari etc. Un prim pas in aceasta directie a fost eliminarea pointerilor care permit adresarea unor variabile de sistem indirect si pot provoca daune. In al doilea rind, codul appleturilor mai este o data verificat in timpul executiei facindu-se verificarile pentru a nu se putea opera actiuni ilegale. In al treilea rind, appleturile din start au fost concepute in asa fel incit sa nu poata scrie, citi pe si de pe harddisk si nici sa poata executa alte programe. In al patrulea rind, deoarece un applet poate realiza ferestre acestea sint dotate cu text sau imagini care sa avertizeze asupra faptului ca e o fereastra Java impiedicind astfel appleturile sa pretinda ca sint ferestre deschise de sistem si sa ceara o parola, de exemplu. Mai exista masuri de securitate in Java, cum ar fi semnaturile digitale dar acestea vor fi tratate intr-un capitol ulterior. Java suporta fire de executie- Java a fost proiectat de la bun inceput astfel incit sa permita executia in paralel a codului, precum si o realizare si o organizare usoara a acestora. Java a fost realizat in principal pentru lucrul pe Internet- de aceea i-au fost adaugate trasaturi care sa permita programarea usoara pe retea. Pot fi realizate aplicatii care sa citeasca posta elctronica sau care sa intretina un chat; care sa preia documente de pe Internet si sa le prelucreze ( cel mai bun exemplu este HotJava, un browser cu capabilitati Java scris in Java ). Controalele Windows (ferestre, butoane, liste derulante etc) pot fi realizate din doua instructiuni. Echipa care a dezvoltat Java pina in acest moment a incercat sa ofere facilitati programatorului in cit mai multe domenii. Astfel, pe linga cele prezentate, Java ofera suport pentru animatie, baze de date, sunete, codificare, separare in atomi lexicali oferind o baza solida pentru orice proiect.

Concluzie Fara indoiala, Java este un limbaj foarte viabil. Limbajele de programare de pina acum aveau nevoie de noi biblioteci complicate pentru a realiza ceea ce Java are incorporat: facilitati Internet, multitasking, securitate s.a. A invatat din experientele nefericite demonstrind de exemplu ca se poate programa foarte bine si fara pointeri (desi nici utilitatea acestora nu poate fi contestata). A introdus noi standarde in programare si se mentine tot timpul in pas cu ultimele noutati. Cu Java s-a reusit o integrare coerenta a celor mai diverse domenii (lista de mai sus), o metoda simpla de adaugare a noilor standarde si o mare usurinta a programarii, lasind informaticienii sa se concentreze mai mult asupra structurii aplicatiei. Toate acestea conduc la afirmatia vicepresedintelui de la Sun, Larry Weber: "Java este un limbaj de generatia a V-a". Desi Java mai are unele puncte slabe (unul ar fi viteza mica de executie, codul Java fiind interpretat in codul masinii pe care se ruleaza, multitudinea de instructiuni care se executa pentru mentinerea componentelor programului--colectorul de resturi, suportul pentru firele de executie s.a.-- care micsoreaza si mai mult viteza) rezolvarea lor este numai o chestiune de timp. De exemplu, in privinta vitezei de executie, Sun a propus o solutie care se numeste just-in-time compiler, acesta fiind responsabil de compilarea codului Java ajuns pe calculatorul utilizatorului in codul masinii sale, diferenta de viteza dintre compilare si interpretare fiind foarte mare. In concluzie, Java este un limbaj care merita sa fie invatat, atit din cauza viitorului luminos care i se deschide cit si din cauza faptului ca a aparut relativ recent--aceasta fiind deci perioada in care se formeaza viitorii mari maestri ai programarii in Java--. Daca aceste argumente sint de ajuns pentru a va trezi interesul, atunci urmatorul pas ar fi obtinerea instrumentelor de programare in Java. Referinta clasica in acest domeniu ramine site-ul firmei Sun cu al sau JDK (Java Development Kit) accesibil la http://java.sun.com . Pachetul JDK pentru majoritatea platformelor este deasemenea disponibil pe ftp la ftp.javasoft.com in directorul /pub. Daca mediul linie de comanda al pachetului original nu va satisface, puteti alege alte pachete, construite bineinteles peste pachetul original JDK, cum ar fi: - Java Workshop, creata de Sun, disponibila la http://www.sun.com/sunsoft/Dev\ eloper-products/java/Workshop/ ; - Symantec Cafe si Symantec Visual Cafe for Java, dezvoltate de firma Symantec, disponibile la http://caf.symantec.com; - Visual J++, dezvoltata de firma Microsoft; Mai sunt multe alte medii de dezvoltare Java, cum ar fi JavaBuilder, PowerJ, SuperCede, VisualAge for Java etc dar alegerea celui potrivit pentru dumneavoastra ar trebui facuta dupa acumularea unor notiuni de baza Java.

Primele programe in Java

Dupa ce in articolul trecut am aruncat o privire in istoria acestui limbaj, a venit momentul sa studiem ceva mai consistent. Vom invata structura unui program, sintaxa si instructiunile cele mai folosite pentru a crea un cod simplu.

Conceptul de obiectLa inceputul erei informatice programele erau scrise in cod masina ce se introducea direct in calculator. Acest cod era greu de inteles si de corectat daca aparea cumva o eroare. Avantajul era insa ca programele scrise astfel foloseau putina memorie si mergeau foarte repede, un avantaj major daca ne gindim cat de scumpa era tehnologia in acele timpuri.

O data cu trecerea timpului au aparut asa-numitele limbaje de nivel inalt, a caror instructiuni erau cuvinte in limba engleza si erau executate efectiv cu ajutorul a zeci pana la sute de instructiuni in cod masina. A aparut si conceptul de procedura, reprezentand o bucata de cod avand o functionalitate bine determinata.

Revolutia cea mai mare insa a adus-o conceptul de obiect. Daca inainte era usor de ajuns la ideea de structura (aceasta fiind o asociere de date de tipuri diferite sub un nume unic) conceptul de obiect a fost mai greu de "digerat".

Pentru a intelege exact ce reprezinta un obiect, sa ne gindim la o structura. De exemplu, o structura continind datele tehnice ale unuei masini : viteza, directie, dimensiuni etc. O masina ar putea fi unic identificat pe baza acestor date. Ar fi deci usor de inteles o structura de forma:

struct Masina {nume: Stringclasa: charviteza: integerlungime: integervit_maxima: integer}

(imi cer scuze pentru pseudocodul atat de barbar !) Aceasta structura inglobeaza, sub acelasi nume, Masina, tipuri diferite de date : String, integer si char. Printr-o linie de genul

struct Masina best1={"Volvo",'C', 0, 1.75, 250}

vom defini o masina Volvo clasa C cu viteza momentana 0 km/h (adica sta degeaba) cu o lungime de 1,75 metri (nu stiu mai nimic despre Volvo !) si o viteza maxima de 250 km/h. In acest mod de declarare a datelor, acestea vor putea fi accesate aproape natural:

// se face upgrade la motorbest1.vit_maxima=300;// se lungeste masinabest1.lungime=1.90// se merge cu masina prin orasbest1.viteza=50

Daca am face un joc pe calculator cu masini am putea face o structura ca cea de mai sus si am defini doua functii care sa modifice viteza masinii si directia :

modifica_viteza( best1, 10) //modifica viteza masinii definite prin variabila best1 cu 10 km/hmodifica_directia(best1, 180) // o intoarcere spectaculoasa cu 180 de grade....

Daca avem mai multe masini in cursa, vom apela cele doua functii de mai sus cu fiecare, in genul :

modifica_viteza(masina5_80_122, 30) // masina care accelereaza repede !modifica_directia(masina_la_fel_de_tare,60) // imaginati-va cum se iau curbele...

Un obiect duce acest concept mai departe : ne putem imagina un obiect ca o structura care contine si functii. Aceste functii ar trebui sa fie caracteristice acelui obiect si sa lucreze cu datele obiectului. De exemplu, o masina este un obiect care isi modifica viteza si directia pentru a duce persoane la destinatie. Ar fi deci natural ca, in loc sa folosim o procedura care modifica viteza si directia pentru diferite structuri reprezentind masini, sa folosim un obiect care, pe linga parametrii descrisi mai sus sa aiba propria sa functie de accelerare, de schimbare a vitezei etc. La urma urmei, un Volvo nu accelereaza la fel de rapid ca un Ferrari ! Functiile de schimbare a vitezei ar trebui sa aiba acelasi nume dar sa fie diferite, caracterizand pe fiecare in parte. Un obiect ar putea fi definit astfel:

Object Masina{nume:String;clasa:String;viteza:integer;lungime:integer;vit_maxima:integer;void modifica_viteza(integer cantitate);void modifica_directia(integer grade);}Ferrari_F50;

Cand dorim sa modificam viteza unei masini vom face un apel de forma

Ferrari_F50.modifica_viteza(-50); // o frina suparata

modalitate mai naturala decat cea de la structuri. Daca dorim sa definim un camion ? Am putea face un nou obiect care sa contina toate caracteristicile unui camion si metodele aferente. Dar daca ne gandim ca un camion este si el masina nu va apuca jalea pentru cat aveti de rescris ? Din fericire, exista o solutie si pentru aceasta problema : mostenirea. Un obiect poate mosteni un altul, preluandu-i toate variabilele si toate functiile (cu unele exceptii pe care le vom prezenta mai tarziu). Astfel, in exemplul nostru, putem defini obiectul Camion astfel (tot intr-un pseudocod apartinind multor limbaje si nici unuia):

Object Camion : Masina{capacitate:integer;void descarca();void incarca();}

Parca lipsesc unele caracteristici.... viteza, dimensiunea, numele... Acestea au fost preluate automat in momentul in care am declarat ca obiectul Camion este derivatul (sau mostenitorul) obiectului Masina. In plus, au mai fost introduse doua metode si o variabila. Variabila capacitate contine capacitatea de transport a camionului, iar cele doua functii realizeaza incarcarea, respectiv descarcarea acestuia. Prin mostenire, se preiau caracteristicile unor obiecte si se refolosesc. Putem spune ca un obiect Camion este si Masina, datorita felului in care se face mostenirea. Un ultim cuvant inainte de a trece la programarea Java: in acest limbaj, obiectele se numesc clase, variabilele de tipul claselor definite mai sus (o asemenea variabila este Ferrari_F50) se numesc instante, functiile din cadrul unei clase se numesc metode. Sa trecem mai departe.

Tipuri de programe Java

Dupa cum am prezentat in articolul trecut, Java a fost conceput pentru a oferi un inalt grad de securitate. Posibilitatea de a executa cod luat de pe Internet pe calculatorul clientului poate deschide cutia Pandorei pentru acesta. De aceea, appleturilor le-au fost limitate capabilitatile prin interzicerea unor actiuni cum ar fi scrierea si/sau citirea de pe harddisk-ul clientului, citirea/scrierea unor variabile de sistem, limitarea comunicatiei prin Internet la calculatorul de pe care a fost preluat appletul, avertizari ale browserelor ca o fereastra a fost deschisa de applet s.a. Daca ar fi fost eliminate complet aceste capabilitati, limbajul ar fi fost serios limitat in actiunile sale. Din fericire, echipa de la Sun ne ofera o solutie : doua tipuri de programe Java. Unul din tipuri, cel care va fi executat prin Internet va fi lipsit de posibilitatile de mai sus, iar celalalt va putea fi executat doar pe calculator ca un program obisnuit, va fi lipsit de limitarile appleturilor dar nu va putea fi distribuit prin Internet. Primul se numeste applet iar cel de-al doilea aplicatie. Limitarea aplicatiilor prin imposibilitatea de a fi executate prin Internet rezulta din capacitatile acestora : acestea putand scrie pe harddisk, ar putea produce pagube ireparabile. O alta limitare a aplicatiilor este aceea ca ele nu beneficiaza de suportul grafic integrat al browserelor, lasandu-se in seama programatorului rezolvarea acestei probleme.

Applet-uri

Un applet reprezinta un program scris in limbaj Java care isi poate afisa rezultatele intre limite bine determinate intr-o pagina de Web. Astfel, un applet ruleaza intr-un dreptunghi de dimensiune specificata in pagina de Web in care este inglobat.

Trebuie spus ca in Java orice este un obiect, pina si programul in sine, cu exceptia tipurilor simple de date (intreg, boolean). Acesta este declarat ca o clasa, iar browserul in care ruleaza instantiaza aceasta clasa de cate ori se incarca appletul.

Cel mai simplu program in majoritatea limbajelor de programare este cel care isi propune afisarea cuvintelor "Hello, world !". Appletul care realizeaza aceasta sarcina arata cam asa:

import java.awt.*;import java.applet.*;

public class Hello extends Applet{

public void paint(Graphics g){g.drawString("Hello, world !",30,20);}

}

Nota: data fiind asemanarea dintre Java si C, o trecere in revista a celui din urma ar fi de mare ajutor. Sa luam acum fiecare linie din program si sa o studiem:

- prima linie spune interpetorului ca programul foloseste clasele din pachetul awt. Java simplifica multe probleme prin folosirea pachetelor, care sunt efectiv biblioteci de clase utile, usurand munca programatorului prin oferirea unor solutii gata facute chiar pentru concepte mai abstracte (cum ar fi o lista, un tokenizer). Printre acestea se gaseste si cea dedicata graficii (awt).

- a doua linie declara folosirea claselor din pachetul applet.

- a treia linie declara o noua clasa numita Hello care extinde (mosteneste) clasa Applet. Procedura care trebuie urmata pentru a realiza un applet este urmatoarea: declararea clasei principale a appletului ca fiind o extindere a clasei Applet predefinite si apoi adaugarea unor metode si suprascrierea celor din clasa Applet.

- a patra linie merita o privire atenta : in ea se declara o noua metoda in cadrul appletului nostru Hello. De fapt, nu se declara, ci se redefineste. Dupa cum am spus mai sus, clasa Hello este derivata din clasa Applet. Printre metodele pe care le transmite clasei Hello clasa Applet se gaseste si metoda paint() care deseneaza in zona rezervata appletului si care este apelata cand appletul este executat prima oara. Insa in clasa originala, Applet, aceasta metoda este goala, de genul

void paint(Graphics g){}

Dupa cum vedeti, in corpul metodei nu se gaseste nici o instructiune, deci in urma apelului nu se obtine nimic. Desigur, nu asta este ceea ce dorim noi, astfel ca vom suprascrie metoda mostenita de la clasa Applet cu una care va face ceea ce dorim noi.

- urmatoarea linie apeleaza metoda drawString() a clasei Graphics. Aceasta este metoda care deseneaza efectiv pe ecran textul dorit. Parametrii care ii sunt transmisi acesteia sunt textul de afisat si coordonatele x si y la care se va scrie.

- Urmatoarele doua linii nu fac decat sa marcheze sfarsitul metodei paint() respectiv cel al programului.

Fisierul care contine textul de mai sus trebuie sa aiba numele hello.java datorita conventiei ca fiecare clasa sa se gaseasca intr-un fisier diferit avand acelasi nume cu clasa. Dupa compilare, vom obtine un fisier cu numele hello.class. Acest fisier va fi folosit in pagina de web in care vom verifica rezultatul appletului.

Fisierul .html care va lamuri misterul poate fi de forma:

Java- Exemplul 1

Appletul "Hello,world !"



Sfarsitul exemplului...

Lansati aceasta pagina HTML intr-un browser cu capabilitati Java si observati rezultatul. Observati cum apare, pe fundalul gri al paginii, suprafata alba a appletului de dimensiuni 200x150 pixeli. Aceasta este "suprafata limitata" despre care vorbeam la inceputul sectiunii. Observati si locul in care apare prima litera a mesajului si ganditi-va la apelul functiei drawString(). Observati, in final, cum a fost inglobat appletul in pagina Web: s-a folosit tag-ul (daca nu stiti ce inseamna tag va recomand calduros articolele despre HTML din revista) cu cativa parametri : code specifica locatia pe Web a appletului; height specifica inaltimea "ferestrei" appletului iar width latimea acesteia.

Testati appletul modificind diferiti parametri: latimea, inaltimea, pozitia textului, textul in sine (folositi unul foarte lung !) si va veti lamuri multe probleme tinind de prezentarea grafica a unui applet. Ca o ultima remarca, daca fundalul paginii .html ar fi fost alb si nu gri, atunci nu ati fi putut determina clar limitele appletului. Astfel, puteti de multe ori sa observati efecte deosebite pe Internet si sa nu stiti ca sunt Java ( desi browserele anunta incarcarea unui applet) .

Trebuie sa fiti atenti la scrierea numelor metodelor si a claselor. Java este un limbaj case-sensitive (adica face distinctia intre caracterele mici si caracterele mari din numele functiilor si a variabilelor). Astfel, drawString este diferit de DrawString si veti primi un mesaj de eroare daca veti incerca sa folositi a doua forma. Exista, totusi, o regula nescrisa care spune ca numele claselor, daca sunt formate din mai multe cuvinte alaturate, poate fi scris avand primul caracter din cuvinte cu majuscula, restul cu minuscula iar numele metodelor alcatuite din mai multe cuvinte pastreaza aceasta regula cu exceptia primului cuvant din nume, care incepe cu minuscula. Astfel, DrawString ar putea fi o clasa iar drawString o metoda. Daca pastrati aceasta regula va va veni mai usor sa cititi programele pe care le-ati scris.

Dupa ce in articolul trecut am aruncat o privire pe structura unui applet, vom ncerca acum sa studiem structura unei aplicatii. O aplicatie, dupa cum stiti probabil, este tot un program Java lipsit de suportul grafic oferit de browser applet-urilor dar fara a mai avea limitarile acestora.

Desi mare majoritate a utilizatorilor folosesc Java pentru a scrie applet-uri, se pot face multe lucruri interesante si cu aplicatiile. Ca un exemplu, browser-ul avnd capabilitati Java oferit de Sun, HotJava, este o aplicatie.

AplicatiilePentru cei care au mai programat in C/C++, aplicatiile vor fi foarte "digerabile", fie si numai pentru ca functia principala a aplicatiilor se numeste main(). Astfel, universalul mesaj care se foloseste la explicarea tuturor limbajelor de programare ar putea rezulta in urma executiei urmatorului program:

Import java.lang.System;

class HelloApp{

public static void main(String args[]){

System.out.println("Hello world !");

}

}

Examinnd programul, vom observa ca HelloApp (clasa) nu mosteneste nici o alta clasa (desi aceasta nu este o regula generala pentru aplicatii). In cadrul acestei clase de sine statatoare se declara metoda main() a aplicatiei, metoda care afiseaza un mesaj (in mod text !) la consola. Amintiti-va ca aplicatiile nu dispun de suportul grafic oferit de browsere, astfel ca, implicit, mesajele sunt afisate in mod text. Sa urmarim insa mai atent linia care face efectiv afisarea unui text pe ecran. Dupa cum stiti, apelul unei metode din cadrul unei clase se face in felul urmator:

nume_clasa.nume_metoda();

iar obtinerea unei variabile din cadrul unei clase se face astfel:

nume_clasa.nume_variabila;

dar noi avem doua puncte in loc de unul singur !

Problema nu este att de complicata daca citim de la dreapta la stnga linia cu pricina. Obtinem astfel:

println este o metoda, dat fiind ca are parametri (in cazul nostru, textul de afisat);

out este un obiect care are ca metoda functia println;

System este un obiect care are ca variabila obiectul out.

Interpretorul de Java va citi insa invers, de la stnga la dreapta. Astfel, va cauta mai nti o variabila in program care sa se numeasca System. Fiindca nu gaseste, cauta mai departe in biblioteca pe care am inclus-o in programul nostru, java.lang.System. Aici va gasi, intr-adevar, un asemenea obiect, pe care l va utiliza mai departe pentru evaluarea expresiei. Astfel, la pasul urmator, interpretorul va cauta un obiect sau variabila in interiorul clasei System care sa se numeasca out. Dupa ce l gaseste si pe acesta, va cauta in obiectul out o metoda numita println pe care, in final, o va executa.

Ce trebuie retinut din toate acestea este ca obiectele pot fi imbricate. Astfel, putem defini o variabila ca obiect in interiorul altei clase, iar apelul se face imbricat. De exemplu, linia de mai sus poate fi scrisa mai sugestiv sub forma

(System.out).println("mesaj");

Prima paranteza poate fi considerata o constructie separata prin care se preia obiectul out din clasa System. Mai departe, dupa ce acesta a fost preluat si este acum cunoscut, i se va atasa restul liniei, in felul urmator:

out.println("mesaj");

linie ce poate fi executata ca orice apel de metoda dintr-o functie.

Fata de rezultatul applet-ului din articolul trecut, rezultatul executiei aplicatiei este mai degraba dezamagitor. Un text scris in mod grafic nu suporta comparatie cu o simpla linie de text gen DOS. Aplicatiile pot avea rezultate grafice, ca orice applet - amintiti-va de browser-ul HotJava, care, desi este o aplicatie, se prezinta sub forma grafica, la fel ca orice fereastra Windows, de exemplu --.

Anticipnd putin articolul urmator, am sa va prezint pe scurt tipurile de data fundamentale in Java. Orice programator de C va observa diferente minime fata de ceea ce stia deja.

Tipurile de date fundamentale se numesc astfel deoarece ele reprezinta cele mai simple tipuri de date in Java. Pe baza lor insa se pot realiza structuri si obiecte foarte complicate. Fara a insista prea mult, tipurile de date fundamentale sunt Boolean, char, byte, short, int, long, float si double.

In Java, variabilele de acest tip se declara exact in acelasi mod ca in C/C++:

int suma;

char tasta;

Boolean buton_apasat;

float distanta_foarte_precis_masurata;

Singura noutate pentru programatorii C ar fi tipul Boolean, care poate avea doua valori : true sau false ( nu 0 sau 1 ! ). Daca vrem sa afisam o variabila de tip fundamental, limbajul Java ne ofera o surpriza placuta, "scapndu-ne" de specificatorii de format de la functia printf din C. Astfel, daca numar este o variabila de tip ntreg de valoare 20, o linie de genul

System.out.println("Numarul este "+ numar);

va afisa "Numarul este 20" (fara ghilimele).

Observati modul in care se "lipesc" cele doua componente ale raspunsului, prin semnul "+". Folosindu-l mai intens, am putea scrie o linie de genul

System.out.println("Iasi - Temperatura: "+temp+";

Umiditatea: "+umid+".");

Desi am folosit in special metoda de afisare folosita la aplicatii, aceleasi reguli se aplica si in cazul applet-urilor. Astfel, linia de mai sus ar putea fi scrisa mult mai frumos intr-un applet cu instructiunea:

g.drawString( 5, 20, "Iasi - Temperatura:

"+temp+"; Umiditatea: "+umid+".");

Probabil ca v-ati dat seama deja ca, pentru a afisa valoarea unei variabile declarate intr-o clasa, se foloseste o constructie de genul

System.out.println("Titlu:"+nume_obiect.nume_variabila);

Ce mai trebuie mentionat este ca metoda println("mesaj") tipareste pe ecran mesaj dupa care trece la linia urmatoare. Astfel, daca nlocuim metoda main() din programul nostru initial cu: Public static void main(String[] args){

int i;

float valoare=123.3678;

for(I=0;I

vom obtine pe ecran patru linii pe ecran. Daca am fi folosit insa metoda print() din cadrul obiectului System.out, aceasta nu ar mai fi facut trecerea automat la urmatorul rnd, astfel ca urmatorul mesaj scris pe ecran ar fi nceput imediat dupa sfrsitul mesajului precedent. nlocuind mai sus println cu print, am obtine ceva in genul

valoare=123.3678valoare=123.3678valoare=123.3678valoare=123.3678

Daca ati nteles modul de lucru cu applet-urile si aplicatiile si ati hotart ca Java este un limbaj care merita sa fie nvatat, ne vom ntlni luna viitoare cu o prezentare mai cuprinzatoare a tipurilor de date si a altor proprietati ale obiectelor.

Crearea unei interfete Andrei Bucos

Desigur, programele prezentate pana acum nu au fost deosebit de spectaculoase. Se pot realiza insa interfete gen Windows destul de usor, oferind applet-urilor un aspect mult mai cizelat. Java a fost realizat astfel incat lucruri destul de dificil de pus in practica in alte limbaje sa fie foarte usor de facut in cateva instructiuni. Astfel, o interfata cu utilizatorul in Visual C nu se poate compara cu una in Java, pur si simplu e mai usor de realizat in aceasta din urma. O interfata cu utilizatorul poate face multe lucruri utile: reactionarea la selectiile utilizatorului, salvarea unor optiuni, prezentare usor de folosit, toate acestea isi pot gasi aplicabilitate in multe programe. Pentru a le realiza, vom folosi pachetul AWT (Abstract Window Toolkit). Acesta ofera componente cum ar fi butoane, liste, meniuri si casute de dialog. Pe linga acestea (cu care se poate interactiona in mod direct) vom folosi si asa-numitul layout manager. Acesta stabileste modul in care vor fi aranjate componentele prezentate mai sus.

Componentele universale Probabil cea mai folosita componenta in mediile interactive este butonul de asemenea si una dintre cele mai usor de realizat. Pentru asta, vom folosi o bucata de cod asemanatoare cu aceasta:

buton=new Button();

buton.setLabel("OK");

Metoda setLabel a clasei Button este folosita pentru a seta

textul scris pe buton. Pentru a realiza casute de bifat (checkbox) vom folosi un cod asemanator:

cb1 = new Checkbox();

cb2 = new Checkbox();

cb1.setLabel("Optiunea 1");

cb2.setLabel("Optiunea 2");

Este de remarcat ca, in aceasta prezentare, vom avea doua casute care pot fi marcate separat fara sa se influenteze una pe cealalta. Daca dorim sa realizam un grup de optiuni dintre care numai una sa poata fi marcata, vom scrie astfel:

Checkbox cb1, cb2, cb3;

CheckboxGroup grup;

grup= new CheckboxGroup();

cb1 = new Checkbox("Optiune 1", grup, false);

cb2 = new Checkbox("Optiune 2", grup, false);

cb3 = new Checkbox("Optiune 3", grup, true);

Se observa constructorul cu trei parametri in acest caz. Primul parametru reprezinta cunoscutul nume al optiunii care va fi afisata langa casuta, al doilea reprezinta grupul de optiuni din care face parte iar al treilea reprezinta starea implicita (selectat sau deselectat). Lista de selectie (choice) afiseaza una din optiunile listei intregi, accesibila prin apasarea butonului asociat. Desi suna complicat, exemplul prezentat mai incolo in acest capitol va va lamuri complet. Banuiesc ca deja banuiti modul de realizare a unei asemenea liste:

lista = new Choice();

Dupa declarare trebuie construita efectiv lista. Aceasta se realizeaza prin metoda addItem a clasei Choice astfel:

lista.addItem("optiune1");

lista.addItem("optiune2");

lista.addItem("optiune3");

Puteti sa va ganditi la lista de optiuni ca la o versiune mai compacta (pe ecran) a grupului de optiuni.

Etichetele (label) reprezinta textul ce nu se poate selecta dintr-o fereastra. O asemenea eticheta ar putea fi utila in cazul listelor de dialog, care nu au in constructor posibilitati de setare a unei texte statice asociate. Toate aceste obiecte sunt realizate omogen, asa ca nu va va surprinde modalitatea de constructie a unei etichete:

text1 = new Label();

text1.setLabel("Eticheta 1");

Folosirea acestor obiecte intr-un applet Pentru ca obiectele prezentate sa poata fi folosite trebuie adaugata la fiecare componenta o linie de cod. Mai exact, componentele trebuiesc "adaugate" applet-ului, deoarece ele trebuie aranjate intr-un anumit fel (in cazul nostru vom folosi aranjamentul implicit, FlowLayout). E de ajuns sa adaugam linia add(nume_componenta);

pentru ca aceasta sa poata fi vizualizata si testata. Intr-un applet, prima metoda care se executa este init (evident). Aici se initializeaza toate variabilele si se adauga toate componentele. Un mic programel demonstrativ este necesar pentru a va lamuri:

import java.awt.*;

import java.applet.Applet;

public class demo extends Applet {

Button b1, b2;

Checkbox cb1,cb2, cb3, cb4;

CheckboxGroup cbg;

Choice lista;

Label txt1, txt2;

public void init() {

b1 = new Button();

b1.setLabel("OK");

b2 = new Button("Cancel");

b2.disable();

cbg = new CheckboxGroup();

cb1 = new Checkbox("Optiune 1",cbg, false);

cb2 = new Checkbox("Optiune 2", cbg, true);

cb3 = new Checkbox("Optiune 3");

cb4 = new Checkbox("Optiune 4");

lista = new Choice();

lista.addItem("Optiune 1");

lista.addItem("Optiune 2");

lista.addItem("Optiune 3");

lista.addItem("Optiune 4");

txt1 = new Label("Selectati o optiune:");

txt2 = new Label("-Sfarsit-");

add(b1);

add(b2);

add(cb1);

add(cb2);

add(cb3);

add(cb4);

add(txt1);

add(lista);

add(txt2);

validate(); }

}

Este interesant de observat ca obiectele sunt afisate pe ecran in ordinea in care au fost adaugate applet-ului (cu "add") si nu in ordinea in care au fost initializate. Organizarea este insa urata. Vom rezolva aceasta problema data viitoare, cand vom discuta despre layout managers. Interesant este si ca, desi butoanele se pot apasa, selectiunile se pot face, nimic nu se intampla, de fapt. Aceasta se datoreaza faptului ca nu am specificat applet-ului cum sa se comporte in momentul in care se intervine asupra componentelor.

HTML pentru Java.

Desi articolul are un titlu care suna a 'pure Java' articolul este mai mult despre HTML. As spune HTML pentru Java. Pna acum cred ca stiti care este diferenta dintre o aplicatie si un applet Java. Cred ca ati observat ca vizionarea applet-ului necesita si cunostinte de HTML. In acest articol imi propun sa tratez acest subiect. Tag-urile implicate sunt si . In cea mai simpla forma folosind CODE, WIDTH, si HEIGHT ca atribute ale tag-ului se pot realiza dimensiunile in care va fi afisat applet-ul respectiv. Ca o simpla observatie atributele pe care le are tag-ul sunt aproape identice cu cele pe care le foloseste tag-ul asa prin prezentarea acestora rezolv doua probleme. Atributul ALIGN stabileste felul in care applet-ul va aparea in pagina. Poate avea urmatoarele valori: LEFT, RIGHT, TOP, TEXTTOP, MIDDLE, ABSMIDDLE, BASELINE, BOTTOM, sau ABSBOTTOM. in cazul in care ALIGN=LEFT sau ALIGN=RIGHT applet-ul este afisat pe partea din stnga sau dreapta a paginii. Celelalte atribute incercati-le singuri (daca nu aveti un applet incercati pe o imagine:-)). Se poate folosi pe lnga applet, in functie de situatie, si tag-ul
(line break) cu atributul CLEAR poate avea una din urmatoarele trei valori. LEFT, RIGHT, ALL. Atributele HSPACE si VSPACE sunt folosite pentru a stabili distanta in pixeli dintre applet si textul din jurul acestuia. HSPACE controleaza spatiul orizontal iar VSPACE controleaza spatiul vertical. Ultimele doua atribute ale tag-ului sunt CODE si CODEBASE. Spre deosebire de alte atribute nici unul dintre acestea nu are nimic legat de modul in care applet-ul urmeaza sa fie afisat in pagina. Ele se refera la locatia actuala a clasei applet-ului (ex.: applet.class) astfel ca browser-ul sa stie de unde sa incarce applet-ul. CODE este folosit pentru a indica numele fisierului *.class care contine applet-ul in directorul curent. Trebuie sa mentionez aici ca fisierele care sunt folosite in CODE trebuie sa aiba extensia *.class. Daca se doreste indicarea sursei aflata in alt director de pe serverul de web trebuie sa ii precizati browser-ului unde poate gasi fisierele class respective. Pentru aceasta se poate folosi CODEBASE. CODE contine numai numele clasei respective. CODEBASE contine un URL unde pot fi gasite clasele. Din cauza faptului ca applet-urile nu au o linie de comanda probabil ca o sa va intrebati cum se poate face sa indicam parametri unui applet. Parametrii unui applet vin cu doua caracteristici: un nume - care este ales de voi si o valoare care este valoarea acelui parametru. De exemplu puteti indica culoarea textului dintr-un applet folosind un parametru cu numele "color" si cu valoarea "blue". Acesti parametri pot fi indicati in sursa HTML folosindu-se tag-ul , tag care trebuie sa fie intre si :

Aici este un applet

In acest exemplu applet-ul are doi parametri: unul al carui nume este "font" si care are valoarea "TimesRoman" si altul al carui nume este "size" si care are valoarea "24". Acesti parametri sunt comunicati applet-ului la incarcare. In cadrul applet-ului se foloseste metoda getParameter() careia i se poate atribui un singur argument de tip string care reprezinta numele parametrului cautat si care primeste in schimb un string corespunzator cu valoarea acelui parametru. In exemplul dat de mine pentru a obtine valoarea atribuita parametrului "font" din pagina HTML in cadrul metodei init() din clasa respectiva trebuie sa aveti o astfel de linie:

String theFontName = getParameter("font");