Sunteți pe pagina 1din 10

ProgramareOrientatapeObiecte

http://arh.pub.ro/lab/poo

ProgramareOrientatpeObiecte
1. Introducereinformaiilaborator

Durata:7laboratoareX2ore Punctaj:30%dinnotafinal Mediudedezvoltare:JDK1.5.0 Sistemdeoperare:FedoraCore5 Toateaplicatiilescrisetrebuiescsalvatepeemailulpersonal Aplicatiedelaborator:chatclientserver

2. IntroducerenlimbajulJava
Javanuestenumaiunlimbajdeprogramare,Javaesteotehnologiecareofersuportdezvoltrii aplicaiilordistribuite,independentedeplatform.Javacalimbajimediudeprogramareafostlansatieste ncontinuaresustinutdefirma SunMicrosystems.CeamaimareparteasintaxeideprogramareJavaeste mostenitdelaC++,daruneledinconcepteledeprogramareobiectualprezentenJavaiaurdcinilen limbajeleSmallTalkiLisp. LimbajulJavaarectevacaracteristicicarelfacunlimbajdesuccespepiaaactualadesoftware. Astfel, limbajul Java poate fi caracterizat ca un limbaj simplu, familiar, robust, orientat pe obiecte, independentdeplatforma,adaptatpentruaplicatiidistribuiteicareasigurunnivelridicatdesecuritate. SpredeosebiredeC++,limbajulJavaestenintregimeorientatpeobiecte.noriceaplicaietrebuie saexistecelpuinoclasinusepotdefinivariabilesaufunciicaresnuaparinuneiclase.nplus,Java mrestegraduldesiguranalcoduluiprinexistentaadouaniveledeverificare:unullacompilareiunulla rulare.AccesullatablourileJavaesteverificatlarulareeliminandastfelposibilitateaaccesuluiaccidentaln afaradomeniuluitabloului.Conversiilentretipurilededatesuntrestricionate,evitnduseastfelscrierea nepermisaaunorzonedememorie. ProgrameleexecutabileJava,numite i bytecodes suntrezultatulcompilriiunuiprogramsurs. Pentruaputeafiexecutatepeoanumitplatform(Windows,Unix)acesteaaunevoiedeunemulatorJava VirtualMachine(JVM)specificrespectiveiplatforme.Caurmareautilizriiemulatorului,unprogramJava poaterulapeoriceplatformncaresepoateexecutaomasinavirtualaJava.
Codul sursa(Hello.java) Compilare(javac)

Bytecode(Hello.class)

Interpretare/Executie(java)

Native CPU(x86)

poolab1 /10 1 19.09.06

ProgramareOrientatapeObiecte

http://arh.pub.ro/lab/poo

OcategoriespecialadeprogrameJavaoreprezintacategoriaappleturilorcaresuntprogrameJava ceseexecutancadrulunuibrowserInternet(NetscapeNavigator,InternetExplorer,Opera,Firefox). LabazadezvoltariiunuiprogramJavastmediuldedezvoltarepusladispozitiedefirmaSun. AcestaesteJavaDevelopersKit(JDK).Existamediiintegrateputernicededezvoltare,depanareitestarea uneiaplicatiiJava,darncadrullaboratoruluisevorfolosiuneltelestandarddeprogramareutilizandmediul JDK 1.5.0 pus la dispozitie de firma Sun. Mediul JDK este disponibil pe Internet la adresa http://java.sun.com,freeware,ndiverseversiuniivariantenfunctiedeplatformadelucru(Windows, Solaris,etc.).MediulJDKcontinepedeoparteoseriedebibliotecideclaseJavanecesarescrieriiunui program(API)ipedealtaparteunsetdeutilitarenecesarecompilarii,testarii,executieiidocumentarii uneiaplicatiiJava.Oclasa,unfisierbytecodecuextensia .class,reprezintaunitateafundamentalaaunui programexecutabilJava.Obibliotecadeclasecuprindeoseriedeclaseceauunnumitorcomun.Oastfelde bibliotecaestecunoscutanJavasubnumeledepackage.JDKincludecatevapackageurifundamentalecare continclasefaradecarenusepotdezvoltaaplicatiiJava.Deexemplu,packageuljava.langcontineclasele fundamentalefaradecareunprogramJavanupoateexista.Acestpackageesteinclusautomatdecompilator faraafinevoiedeprecizarisuplimentare.Utilizareauneiclasedinoricarealtpackagedecatjava.langintrun programJavasespecificaprindirectivele: importnume_package.*; importnume_package.nume_clasa; Dintreprogramelededezvoltarepuseladispoziiaprogramatoruluiamintim: javac estecompilatorulJavacaretransformasurseletextscrisenlimbajdeprogramareJavan codexecutabilpemasinavirtuala.Fisierulsursa,cuextensia.javasetransmitecaiparametrunprogramul javac.Vorrezultaoseriedefisierecuextensia .class,nfunctiedenumaruldeclasedefinitenfisierul sursa. java esteinterpretorulJavacareexecutaprogrameleJava(fisierele .class).Esteutildoarpentru executiaaplicatiilorJavastandalone,nuiaappleturilor.Arecaparametrunumelefisierului(faraextensia .class)rezultatnurmacompilarii.

DezvoltareaiexecutiauneiaplicatiiindependenteJava 2.1.
EtapelencreareailansareanexecutieauneiaplicatiiJavasunt:scriereacodului,compilarea, interpretareailansareanexecutie.EditareaunuiprogramJavasepoatefaceutilizandoriceeditorsimplu detext,caresalveazadatelenformattext.Sevafolosinlaboratorutilitarulkate,datoritafacilitatilorpe careleofera:editareafisierelorsursaJava,C,C++,HTML,Verilogetc.cuoptiunidehighlightacuvintelor cheiealelimbajului.Pentrucompilaresirulare,sevorfolosicomenzile java,respectiv javac dinliniade comanda. UnexempludefisiersursaJavaestefisierulHello.javacecontineurmatoareleliniidecod: /* *ProgramulafiseazatextulHelloiseincheie */ publicclassHello{ publicstaticvoidmain(Stringargs[]){ System.out.println(Hello);

poolab1 /10 2 19.09.06

ProgramareOrientatapeObiecte }//endmain }//endclass

http://arh.pub.ro/lab/poo

Una din condiiile cafiierulsursaJava sapoat fi utilizatmaideparte(compilat) este sa aiba extensia.java.Inprogramuldemaisusecuprinsuncomentariu/**/caresepoateextindepemaimulte linii i pe care compilatorul nu il ia n considerare. Ca i n C++, un alt tip de comentariu este //, comentariudelinie.Fiierultrebuiesacontinaodeclaratiedeclasa.Pescurt,o clasa esteuntipdedate generic,carepelangadate(numiteimembrii)reprezentandstarea,contineifunctii(metode)cereprezinta functionalitatea.Materializarea(instanta)uneiclasesenumeste obiect.Avnd publicclass ndeclaratia clasei,esteobligatoriucafiierulsaaibanumeleclasei.Incazuldezvoltariiaplicatiilor(nuiaappleturilor) clasatrebuiesacontinametodamain()deforma: publicstaticvoidmain(Stringargs[]){ //... }//endmain AceastametodtrebuiesaexistenoriceaplicatieJava,fiindprimametodapelatcandselanseaz nexecutieunprogram(un bytecode)Java.Termenul public esteuncuvantcheieallimbajuluiJavain acestcontextindicfaptulcametodamain()esteometodapublic,adicpoatefiapelatdinoricealtaclasa. Datoritcuvntuluicheiestatic,metodamain()esteometodalegatadeclasaHelloinudeunobiect,deo instanta a ei. args[] este un tablou de siruri de caractere (String) i reprezinta parametrii din linia de comandaaiprogramuluiapelat.Ininteriorulmetodeimainsescrieceeacesedorestecaprogramulsafaca, nacestcaz,afiareasiruluiHello.Systemesteoclasacecontineunmembrustaticoutcaruiaisepoateapela ometodaprintln()carearecaparametruirulcaresetiprete. Dacoperaiadecompilaresefacecusuccess(nuapareniciunmesajdeeroare)seobineunnou fisierHello.class,fisiercecontineprogramulexecutabilJava.

StructuralexicalaaunuiprogramJava 2.2.
StructuraigramaticaunuiprogramJavaseaseamanafoartemultcuceaaunuiprogramC++. LimbajulJavacontineurmatoareleunitilexicale: Comentariioferposibilitateadocumentariiprogramuluinvedereauneintelegerimaiuoare aprogramuluisurs. Cuvintecheiesuntcuvintecareauunsensspecialnlimbajiinsotescvariabilele,metodele, membrii,claseleetc.Javadispunedeurmatoarelecuvintecheie(keywords): abstract boolean break byte case catch char class default do double else extends final finally float if implements import instanceof int interface long native private protected public return short static super switch throw throws transient try void volatile while this

poolab1 /10 3 19.09.06

ProgramareOrientatapeObiecte const continue for new synchronized

http://arh.pub.ro/lab/poo package

Identificatorii suntiruridecaractereireprezintnumeledatuneivariabile,clasesauunei funcii.Conditii:irulncepecuolitersaucaracterulunderscore(_);irulestediferitdeorice cuvntcheie;irulestediferitde null, false, true.Deinuexistoregulobligatoriepentru scriereaidentificatorilor,existanumiteconveniiutilizate:identificatoriinumelordeclasencep cumajuscul,fiecarecuvntdistinctdinidentificatorncepecumajuscula;identificatoriide variabilancepculiteramic,fiecarecuvntcareurmeazncepecumajuscul;identificatorii uneifunciirespectreguladelavariabile. Literaliireprezintvaloriconstantedediferitetipuridedateprimitive(ntreg,caracteretc). Separatoriisuntutilizatipentruaseparaunittilelexicaleuneledealtele.Acestiasunt:(){} [];,. Operatorisuntnecesaripentruarealizaoperatiilecareseaplicasupraunordatedinprogram.

Tipuridedate,OperatoriiInstructiuni 2.3.
TipurilededatedinJavaseclasificndoucategorii: TipuridedateprimitivereprezintaceledatecaresuntincluseimplicitnlimbajulJava.Sunt tipurinumericeintregi(byte,short,int,long,char),tipurinumericereale(float,double)itipul boolean(boolean). Tipuridedatereferin suntclasele,tablourileiinterfeele. CainlimbajulC++,clasele reprezinttipurigenericededatecaracterizateprintrostaredefinitadeatributeleclaseiiprintr ofunctionalitatedefinitademetodeleclasei;tablourilesuntcoleciidedatedeacelaitip,iar interfeelesuntunfeldeclaseabstacteivorfistudiatenlucrareaurmtoare.

Variabileledetipprimitivsepotcreanumaiprindeclaraie(careestenacelaitimpiodefiniie). Variabilele de tip referin se pot crea cu operatorul new, care (spre deosebire de C++) returneaz o referin.OreferinJavaesteunidentificatoralunuiobiectieste,defaptunpointerascuns,asemntorcu oreferinC++,decaresedeosebetenprimulrnddinpunctdevederesintactic(nusemaifolosete operatorul&ladefiniiauneireferine). Deoarecenusepotdefinireferinepentrutipurileprimitive,npachetuljava.langsuntdefinitemai multeclasecarempacheteazatipurileprimitive,adicaucadatmembruovariabildetipulprimitiv respectiv.AcesteclasesuntByte,Short,Integer,Character,Float,Doubleetc.Majoritateaacestorclase(cu excepiaclaselor IntegeriCharacter)auaceeaidenumirecaitipuldedateprimitivecorespunztor,cu primulcaractermodificatnmajuscul. Ctevaexempledecrearedevariabiledetipprimitividetipreferinsuntdatenprogramul urmtor(Numar.java) //FisierNumar.java publicclassNumar{ intnumar;

poolab1 /10 4 19.09.06

ProgramareOrientatapeObiecte // publicNumar(int_numar){ numar=_numar; }//endNumar // publicstaticvoidmain(String[]args){ int_integer=10; Integer_integer1=newInteger(100); Byte_byte1=newByte((byte)20); Character_character1=newCharacter('A'); Numar_numar1=newNumar(7); System.out.println("int:"+_integer); System.out.println("Integer:"+_integer1); System.out.println("Byte:"+_byte1); System.out.println("Character:"+_character1); System.out.println("Numar:"+_numar1.numar); }//endmain // }//endclass

http://arh.pub.ro/lab/poo

nacestprogramsecreazovariabildetipprimitiv(ntregint)prindefiniie(declaraie)imai multeobiectedetipulclaselorInteger,Byte,Character,Numar,folosindoperatorulnew.Fiecarevariabil creatseafieazlaconsolfolosindfunciaSystem.out.println().ClasaNumaresteoclasnoucreatn program,aacumsevedenlisting.Laexecuiaacestuiprogramseobinurmtoareleliniiafiatelaconsol:

n Javaesteesteimplementatmecanismul de motenire simpl, prin careo clas poateextinde (deriva)osingurclasdebaz,iarierarhiadeclasecaresecreeazareordcinunic,clasaObjectdin pachetuljava.lang.ClasaObjectdefinetemetodedebazpentrumanevrareaobiectelor,metodecaretrebuie sfieredefinitenclaselederivate(metodeletoString(),equals()ialtele).Dacnprogramsedefineteo clascarenuestederivatdinnicioaltclas,atunci,nmodimplicit,eaextindeclasa Object,ceeace nseamnc,deexemplu,urmatoareledouadefinitiisuntechivalente:

poolab1 /10 5 19.09.06

ProgramareOrientatapeObiecte

http://arh.pub.ro/lab/poo

classX classXextendsObject OperatoriiJavasepotclasifican: Operatoruldeatribuire:= Operatoribinari:+*/% Operatoriunari:+++ Operatoridecomparaie:==!=>>=<<= Operatorilogici:conditionali&&||ibooleeni!&|^ Operatorilaniveldebit:&|^~(complementare)<<(deplasarestangacusemn)>>(deplasare dreaptacusemn)>>>(deplasaredreaptafarasemn) Operatorideatribuirecombinai:aritmetici+==*=/=%=ilaniveldebit&=|=^=<<=>>= >>>=

Operatorul + suprancrcat pentru clasa String. n Java nu este admis suprancrcarea operatorilor,cuexcepiaoperatoruluideadunarepentruclasaString.Clasa String(dinpachetuljava.lang) conineunirdecaractereinumeroasemetodepentruoperaiiasupraacestora.Operatoruldeadunare suprancrcatpentruclasaStringadmitetreiformedeapel: sir+var var+sir sir1+sir2 nurmaacesteioperaiiseobtineunobiectirdecaractere(String)careconineunirdecaractere formatprinconcatenareacelordousubiruricorespunztoarecelordoioperanzi.Seconsidercoperandul denumitsir(sausir1,sir2)esteoconstant(literal)irdecaractere(deexemplu,abcde)sauoreferinla unobiectString.ncazulncarevariabilavaresteoreferinlaunobiect,seutilizeazmetodatoString()a claseiobiectului(dacesteredefinitnaceaclas)saumetodatoString()motenitdelaclasaObjectpentru aobinesubirulcareintervinenoperaie.Exemple: Stringsir1=ABC,sir2; inta=2; floatb=14.32f; booleanc=true; Objectobj=newObject(); sir2=sir1+a; System.out.println(sir2); sir2=XYZ+b; System.out.println(sir2); sir2=sir1+c; System.out.println(sir2); sir2=sir1+obj; System.out.println(sir2);

//afisare:ABC2 //afisare:XYZ14.32 //afisare:ABCtrue //afisare:ABCObject@12123

poolab1 /10 6 19.09.06

ProgramareOrientatapeObiecte

http://arh.pub.ro/lab/poo

Metoda toString() motenitdinclasa Object returneaznumeleclaseiiovaloaredeidentificare unicaobiectului(hashcode),valoarealocatdemainavirtualnmodunicunuiobiect.Deobiceifunctia toString()seredefinetepentrufiecareclas. Operatorulinstanceofesteutilizatpentruatestadacunobiectesteoinstanauneianumiteclase. Formageneralaacestuioperatoreste: nume_obiectinstanceofnume_clasa Operatorulinstanceofreturneaztruedacobiectul(cureferinanume_obiect)esteoinstanclasei nume_clasasauauneisuperclaseaacesteia;ncazcontrar,returneazfalse. Exemple: Class1obj1; Class2obj2; //Class2derivatadinClass1 Class3obj3; booleantest; test=obj1instanceofClass1; //true test=obj1instanceofClass2; //true test=obj1instanceofClass3; //false InstruciunileJavasuntfoarteasemnatoarecuinstruciunileC/C++isunturmtoarele:ifelse, switch, for, while, do, break, continue, return. Exist dou mari diferene fat de limbajul C/C++. O deosebireprivesteinstrucunileceimplicexpresiiconditionaledininstructiunile ifelse, for, while, do. DacnCacesteexpresiiputeaufidetipint,nJavaeletrebuiesfiestrictdetipulboolean(nJavanueste posibilaconversiadinintnboolean).OaltdeosebireestelegatdeinstructiuneagotocarelipsestenJava fiindsubstituitadeinstructiunilebreakicontinuecarepotprimioetichetadesalt.

Tablouri 2.4.
Untablou(array)esteolistdeelementedeacelaitipplasatentrozoncontinudememorie, carepotfiadresateutilizndunnume,unidentificatorcomun.Tipulelementelordintabloutrebuiesfiede acelaitipipoatefioricaretipprimitivsautipreferin. UntablouJavaesteuntipreferint,deciidentificatorul(numele)unuitabloureprezinoreferin(o adresa)lalocatiaundesegsestentregultabloudeelemente.UntablouJavaesteunobiectcareconine,n afar de elementele tabloului o variabil membr public length din care se poate citi (nu i scrie) dimensiuneatabloului. Tablourile pot fi definite pentru tipuri primitive sau pot conine referine la obiecte (clase). Tablourile de date primitive conin chiar acele date memorate n elementele tabloului, iar tablourile de obiecte(tipreferin)coninreferinememoratenelementeletabloului.Dimensiunileunuitablousuntfixe (nusemaipotmodificadupcreare).

poolab1 /10 7 19.09.06

ProgramareOrientatapeObiecte

http://arh.pub.ro/lab/poo

Prindeclarareaunuitablousecreazovariabilreferinavndvaloareanull(carenurefernimic). Nusealocspaiupentruelementeletabloului.Formageneraldedeclarareaunuitablouunidimensional este: tipnume_tablou[]; //sau tip[]nume_tablou; Exemple: int[] tabInt; String tabString[]; Object[] tabObjects; Dupdeclarareaunuitablouurmeazinstantierealui,adicaalocareazoneidememorienecesarstocarii elementelor lui. Instanierea unui tablou se poate face n doua moduri. Cel mai utilizat mod este prin utilizarealuinewastfel: nume_tablou=newtip[nr_el]; nacestmodsaalocatozondememorienecesarstocariiunuinumardenr_el,zonacarepoatefi adresatprinreferinanume_tablou.Totacumsealocvariabilalengthcarevaconinelungimeatabloului (numrul de elemente ale tabloului). Elementele tabloului conin datele de tip primitiv sau referine la obiecteisuntiniializatelavaloriimplicite.Elementelordetipnumericlisevaatribuievaloarea0,celorde tipbooleanvaloareafalseiarcelordetipreferinvaloareanull. Unaldoileamoddeinstaniereaunuitablouicareestevalabildoarnmomentuldeclaraieilui esteurmtorul: tipnume[]={el1,el2,....elN}; Prin aceast construcie se aloc spaiu elementelor tabloului (la fel ca i n cazul utilizrii operatorului new) i se atribuie elementelor valorile specificate n lista de iniializare (altele dect cele implicite) elementelor din tablou. Dimeniunea tabloului rezult din numrul de elemente din lista de iniializare.Elementeleunuitablousepotaccesafolosindoperatoruldeindexare([]). Exemple: int[]tabInt=newint[10]; intx=tabInt[2]; longtabLong[]=newlong[4]; chartabChar[]={t,a,b,l,e}; Indexulcaresefolosetenoperaiadeindexaretrebuiesaibovaloarentreagpozitiv,cuprins ntre0ilength1.Dacvaloareaindexuluinuestepozitivsaudepetedimensiuneatabloului,ncursul execuiei se va arunca o excepie java.lang.ArrayIndexOutOfBoundsException (despre exceptii, in laboratoareleurmatoare). Untabloumultidimensionalesteimplementatcauntabloudetablouri.Pentruainiializauntablou multidimensionalsepoatefolosioperatorul new sauolistdeinitializarelafelcaincazultabloului unidimensional.

poolab1 /10 8 19.09.06

ProgramareOrientatapeObiecte Exemple: int[][]tab1; tab1=newint[2][3]; int[][]tab2={{2,3,4},{3,4,5}}; int[]tab3[];

http://arh.pub.ro/lab/poo

//sedeclaraiseinstantiaza //untabloubidimensional //declaratieechivalentacuint[][]tab3;

Operaiicutablouri.npachetuljava.utilexitsclasaArrayscareconinemaimultemetodestatice carepotfiapelatepentruoperaiiasupraelementelordintablouri.Ctevadintreacestemetodesunt: fill(tip[],val),pentruumplereaunuitabloudedatedetipul tip cuvaloarea val (deacelaitip dat).Existmaimultevesiunisuprancrcate,pentrutipuriprimitiveipentrureferine(laclasa debazObject):fill(int[]a,intv),fill(Object[]a,Objectv). equals(tip[]a,tip[]v),returneaztruedacceledoutablouri(dedatedeacelaitip)autoate elementeleegale. sort(tip[]a),sorteazelementelevectoruluia(careconineelementedetipultip).

3. Conventiidescriereacodului
LalaboratoruldePOOsevapunctasimodulincareunprogramestepaginat,tabulat,modulincaresunt denumitecalsele,metodelesivariabilelesiingeneralmodulincarecodulestestructurat.Regulilecare trebuierespectatesunt: ntrunfiierJavasedefinesteosinguraclas. Segmentelefiieruluiaparnurmtoareaordine: Comentariuldeintroducere(header) Declaraiadepachet Directiveledeimport Declaraiadeclas/interfa Declaraiiledecmpuri:aleclasei(statice),aleinstanei,constante(toateidentatecu untab). Constructori,delacelmaipuincomplexlacelmaicomplex(neidentate) Metode(neidentate) Comentariuldefinal(footer) Toatesegmentelefiieruluisuntdespriteprintroliniecomentariuceapareinclusivntre constructoriintremetode. Metodamain,dacexist,esteplasatntreconstructoriimetode. Pentru instruciuni if / dowhile / for / case, i pentru blocul metodelor, acolada care deschidebloculdeinstruciuniseaflpeaceeailiniecuinstruciunea/declaraiainiialiaracolada definalseaflpeolinieseparat,peaceeaicoloanacuprimaliterdininstruciune/declaraie.De exemplu: if(numar==3){ //...dosomething... }

poolab1 /10 9 19.09.06

ProgramareOrientatapeObiecte

http://arh.pub.ro/lab/poo

Unblocdeinstruciuniesteidentatcuuntabfadenivelulimediatsuperior. Numeledeclase,implicitconstructori,ncepcumajuscul.Deexemplu:NumeClasa. Numeledemetodencepculiteramic.Deexemplu:numeMetoda. Numeledecmpurincepculiteramic.Deexemplu:numeCamp. Numeledeconstantesuntscrisenumaicumajuscule,cuvintelefiinddespariteprin_.De exemplu:TYPE_ERROR. Argumentele si variabilele locale ale metodelor sunt declarate imediat sub declaraia metodei,neidentate,incepcucaracterul_,avndadoualitermic.Excepiefaccontoriide cicluri:i,j,k. Numele trebuie s fie ct mai sugestive n ceea ce privete scopul lor, pentru a evita comentariileexcesive. Acesteconventiidescriereacoduluisuntdoarunminimnecesar(siobligatoriu)pentrulaboratoruldePOO. PentruceicevorsacunoascatotsetuldeconventiidescriereacodarerecomandatdeSunMicrosystemsil potgasilaadresa:http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html

4. Referinte
4.1.KevinTaylor,JavaProgrammingTutorial, http://java.about.com/od/beginningjava/a/beginjavatutor.htm 4.2.BruceEckel,ThinkinginJava,3rded.Revision4.0, http://arh.pub.ro/mirrors/eckelbooks/TIJ3/TIJ3.htm 4.3.SunMicrosystems,TheJavaTutorials, http://java.sun.com/docs/books/tutorial/java/TOC.html

5. Exercitii
5.1.SasescrieoclasaMesajcaresaabstractizezenotiuneadescrisoarepostala.ClasaMesajar trebuisacontinacampuripentrudestinatar,expeditorsicontinutulmesajului. 5.2.SasescrieofuctieafiseazaMesaj()apartinandclaseiMesajcaresaafisezelaconsolatoate informatiilecontinutedemesaj. 5.3.SasescrieofunctiemaincaresainstantiezeaceastaclasaMesajcudiferitevalorisisase apelezepentrufiecareinstantafunctiaafiseazaMesaj().

poolab1 /10 10 19.09.06

S-ar putea să vă placă și