05-clase obiecte tablouri

Upload: nourescu-claudia

Post on 13-Oct-2015

5 views

Category:

Documents


0 download

TRANSCRIPT

  • M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri

    U.T. Cluj-Napoca Programare orientat pe obiecte 1

    Clase, obiecte i tablouri

    1 Constructori La crearea unei noi instane a unei clase (un obiect nou) folosind cuvntul cheie new, este invocat un constructor pentru clasa respectiv. Constructorii sunt folosii pentru a iniializa variabilele instan (cmpurile) unui obiect. Constructorii sunt asemntori metodelor, dar exist cteva diferene importante. Numele constructorului este numele clasei. Un constructor trebuie s aib acelai numele le fel cu clasa n care se afl. Constructorul implicit. Dac nu definii un constructor pentru o clas, compilatorul creeaz automat un implicit, fr parametri. Constructorul implicit invoc constructorul implicit pentru printe (super()) i iniializeaz toate variabilele instan la valorile implicite (zero pentru tipurile numerice, null pentru referine la obiecte i false pentru booleene). Constructorul implicit este creat numai atunci cnd nu sunt definii constructori. Dac definii constructori pentru o clas, atunci nu se mai creeaz automat un constructor implicit. Diferene ntre metode i constructori :

    Constructori nu au tip returnat. Valoarea este obiectul nsui aa c nu este nevoie s se indice o valoare returnat.

    Nu exist instruciune return n corpul constructorului. Prima linie din corpul constructorului trebuie s fie ori un apel la un alt constructor al aceleiai

    clase (folosind this), ori un apel al constructorului superclasei (folosind super). Dac prima linie nu este nici unul dintre apeluri, compilatorul insereaz automat un apel la constructorul fr parametri al superclasei.

    Aceste diferene de sintax dintre un constructor i o metod sunt uneori greu de vzut n surs. Poate ar fi fost mai bine s existe un cuvnt care s marcheze clar constructorii, aa cum sunt n unele limbaje. this(...) Apeleaz un alt constructor din aceeai clas. Adesea un constructor cu mai putini parametri apeleaz un constructor cu mai muli parametri dnd valori implicite parametrilor care nu sunt prezeni. Folosii acest apel pentru constructori din aceeai clas. super(...). Folosii super pentru a apela un constructor dintr-o clas printe. Apelul constructorului pentru superclas trebuie s fie prima instruciune din corpul unui constructor. Dac constructorul implicit al superclasei satisface nevoile, atunci nu este nevoie s facei apelul, deoarece acesta se va face automat. Super va fi folosit i exemplificat la capitolul despre motenire. Exemple de apel explicit al constructorului this: public class Point { int m_x; int m_y; //============ Constructor public Point(int x, int y) { m_x = x; m_y = y; } //============ Constructor fara parametri public Point() { this(0, 0); // Apeleaza alt constructor. } . . . }

  • M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri

    U.T. Cluj-Napoca Programare orientat pe obiecte 2

    2 Tablouri Un tablou poate stoca valori de acelai fel. Fiecare valoare poate fi accesat prin specificarea unui indice. "Tablou" n Java nseamn aproximativ acelai lucru ca tablou, matrice sau vector n matematic. Spre deosebire de matematic, un tablou Java trebuie declarat i trebuie s i se aloce o cantitate fix de memorie. 2.1 Declararea unui tablou Un tablou este ca alte variabile trebuie declarat, adic trebuie specificat tipul elementelor din tablou. Toate elementele trebuie s fie de acelai tip.. Se scrie numele tipului elementelor, apoi "[]", apoi numele variabilei tablou. Declaraia aloc doar suficient spaiu pentru o referin la un tablou (tipic 4 octei), dar nu creeaz efectiv obiectul tablou. String[] args; // args este un tablou de String int[] scores; // scores este un tablou de int JButton[] bs; // bs este un tablou de JButton

    Nu se specific dimensiunea n declaraie. Spre deosebire de alte limbaje, nu se pune niciodat dimensiunea tabloului n declaraie, deoarece o declaraie de tablou specific doar tipul elementelor i numele variabilei. Alocai obiectul tablou cu new. Un tablou se creeaz cu new. Exemplul urmtor creeaz un tablou de 100 elemente de tipul int, de la a[0] la a[99]. int[] a; // Declara a ca fiind un tablou de int a = new int[100]; // Aloca un tablou de 100 int

    Acestea sunt adesea combinate ntr-o singur linie. int[] a = new int[100]; // Declara si aloca.

    Indici Indicii sunt inclui ntre paranteze ptrate []. xi din matematica este x[i] n Java. Gamele pentru indici ncep ntotdeauna la zero deoarece Java provine n mare parte din C++, limbaj care avea un motiv bun pentru folosirea lui zero (aritmetica cu poanteri pe tablouri). Nu este modul n care numra de obicei oamenii, dar asta e. Java verific ntotdeauna legalitatea indicilor pentru a se asigura ca indicele este >= 0 i mai mic dect numrul de elemente din tablou. Dac indicele este n afara acestei game, Java arunca o excepie de tipul ArrayIndexOutOfBoundsException. Acest comportament este net superior celui din C i C++, limbaje care permit referine n afara gamei corecte. n consecin, programele Java sunt mult mai puin susceptibile la erori i carene de securitate dect programele C/C++. Lungimea unui tablou Fiecare tablou are o variabil instan constant (final) care conine lungimea tabloului. Putei afla cte elemente poate pstra un tablou scriindu-i numele urmat de .length. n exemplul anterior, a.length ar fi 100. inei minte c acesta este numrul de elemente din tablou, cu unul mai mult dect indicele maxim. Idiomul Java pentru ciclarea peste un tablou Cea mai frecvent folosire a lui .length se regsete condiia de testat n buclele for. Spre exemplu, n fragmentul de cod urmtor variabila i va traversa ntreaga gam de indici a tabloului a. for (int i=0; i < a.length; i++) {

  • M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri

    U.T. Cluj-Napoca Programare orientat pe obiecte 3

    . . . }

    Dac avei nevoie doar s referii valoarea fiecrui element, putei folosi bucla oarecum mai simpl din Java 5, care ine evidena indicelui i atribuie valori succesive unei variabile (v n acest exemplu). for (int v : a) { . . . }

    Exemplu, versiunea 1 Adunarea elementelor unui tablou Fragmentul urmtor creeaz un tablou i pun 1000 de valori aleatoare n el. Cea de a doua bucl adun toate cele 1000 elemente. Ar fi fost mai bine s le adugm n prima bucl, dar prin aceast scriere avem dou exemple de bucle. int[] a; // Declar un tablou de int a = new int[1000]; // Creaz un tablou de 1000 int. //... Atribuie valori aleatoare fiecarui element. for (int i=0; i < a.length; i++) { a[i] = (int)(Math.random() * 100000); // Numarul aleatoriu in gama 0-99999 } //... Aduna toate valorile din tablou. int sum = 0; // Initializeaza suma totala la 0. for (int i=0; i

  • M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri

    U.T. Cluj-Napoca Programare orientat pe obiecte 4

    2.2 Iniializarea tablourilor La declararea unui tablou, putei i s alocai un obiect tablou preiniializat n aceeai instruciune. n acest caz, nu furnizai mrimea tabloului fiindc Java numr valorile din iniializare pentru a determina mrimea. Spre exemplu, // stil Java 1.0 mai scurt, dar poate fi folosit DOAR IN DECLARATII String[] days = {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"};

    Variabilele tablou sunt referite la tablouri La declararea unei variabile tablou, Java rezerv memorie suficient doar pentru o referin (numele Java pentru adresa sau poanter) la un obiect tablou. Referinele necesit n mod tipic doar 4 octei. La crearea unui obiect tablou cu new se returneaz o referin, iar acea referin poate fi asignat unei variabile. La asignarea unui tablou la un altul, doar referina este copiat. Spre exemplu: int[] a = new int[] {100, 99, 98}; int[] b; // "a" poanteaza spre un tablou, iar "b" nu poanteaza spre nimic b = a; // Acum b se refera la ACELASI tablou ca si "a" b[1] = 0; // Schimba si a[1] deoarece a si se se refera la acelasi tablou. // Att a ct si b se refera la acelasi tablou cu valorile {100, 0, 98}

    2.3 Noiuni mai complicate Tablouri anonime Java 2 a adugat tablourile anonime, care v permit s creai un tablou de valori nou oriunde n program, nu doar ntr-o iniializare ntr-o declaraie. // Acest stil anonim de tablou poate fi folosit si in alte instructiuni. String[] days = new String[] {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"};

    Sintaxa tablourilor anonime poate fi folosit i n alte pri ale programului. Spre exemplu: // In afara declaratiei puteti face aceasta atribuire. x = new String[] {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"};

    Trebuie s avei grij s nu creai aceste tablouri anonime n bucle sau ca variabile locale, deoarece fiecare folosire a lui new va crea un alt tablou. Alocarea dinamic Deoarece tablourile sunt alocate dinamic, valorile de iniializare pot fi expresii arbitrare. Spre exemplu, apelul urmtor creeaz dou tablouri noi pe care le transmite ca parametri lui drawPolygon. g.drawPolygon(new int[] {n, n+45, 188}, new int[] {y/2, y*2, y}, 3);

    Declaraii de tablouri n stil C Java v permite i s scriei parantezele ptrate dup numele variabilei n loc s le scriei dup tip. Acesta este modul n care se scriu declaraiile de tablouri n C, dar nu constituie un stil bun pentru Java. Sintaxa C poate arata foarte urt avnd o parte a declaraiei nainte de variabil i o parte dup. Java are un stil mult mai curat, n care toat informaia de tip poate fi scris fr a folosi o variabil. Sunt situaii n care acest stil Java este singura notaie care se poate folosi.

  • M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri

    U.T. Cluj-Napoca Programare orientat pe obiecte 5

    int[] a; // stil Java -- bun int a[]; // stil C -- legal, dar nerecomandat

    2.4 Probleme frecvente la tablouri Cteva probleme frecvent ntlnite la folosirea tablourilor sunt:

    Se uita c indicii ncep de la zero. Se scrie a.length() n loc de a.length. Metoda length() este folosit la String, nu la tablouri. Declararea unui tablou cu mrime. D.e., int[100] a; n loc de int[] a = new int[100];

    2.5 Metode de bibliotec pentru tablouri Exist metode de bibliotec, statice pentru manipularea tablourilor n clasa java.util.Arrays. Arrays.asList() Returneaz un List (list) pe baza tabloului. Arrays.toString() Returneaz o form citibil a tabloului. Arrays.binarySearch() Execut o cutare binar pe un tablou sortat. Arrays.equals Compar dou tablouri dac sunt egale.. Arrays.fill() Umple tot tabloul sau o subgam cu o valoare. Arrays.sort() Sorteaz un tablou. n plus, exist metoda System.arrayCopy(). Inversarea unui tablou Aceast versiune a inversrii folosete doi indici: unul care ncepe la stnga (nceputul) tabloului i un altul care ncepe la dreapta (sfritul) tabloului. Se poate folosi i o bucl care merge spre mijlocul tabloului. //========================================================= reverse public static void inverseaza(int[] b) { int stinga = 0; // indexul elementului celui mai din stnga int dreapta = b.length-1; // indexul elementului celui mai din dreapta while (stinga < dreapta) { // interchimba elementele din stinga si dreapta int temp = b[stinga]; b[stinga] = b[dreapta]; b[dreapta] = temp; // deplaseaza limitele spre centru stinga++; dreapta--; } }//sfrsit metoda inverseaza

    O bucl for care s mearg spre mijloc ar nlocui cele 8 instruciuni de mai sus cu ceea ce urmeaz. Ambele bucle sunt la fel de rapide, aa c alegei-o pe cea care vi se pare mai de neles. for (int stinga=0, int dreapta=b.length-1; stinga

  • M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri

    U.T. Cluj-Napoca Programare orientat pe obiecte 6

    2.6 Tablouri multidimensionale Tablourile din Java sunt de fapt tablouri liniare, unidimensionale. Cu toate acestea, se pot construi tablouri cu mai multe dimensiuni, ntruct exista posibiliti de creare a lor. Exemplele care urmeaz folosesc toate tablouri bidimensionale, dar sintaxa i codificarea se poate extinde pentru oricte dimensiuni. Prin convenie, tablourile bidimensionale au linii (orizontale) i coloane (verticale). Primul indice selecteaz linia (care este un tablou monodimensional n sine), iar cel de-al doilea selecteaz elementul n acea linie/acel tablou. Vizualizarea tablourilor bidimensionale S presupunem ca avem un tablou, a, cu trei linii i patru coloane. a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]

    Tablourile bidimensionale sunt vizualizate de obicei matrice, cu linii i coloane. Diagrama urmtoare arat un tablou cu indicii corespunztori. +-----+ | | +-----+-----+-----+-----+ |a[0] | -> | [0] | [1] | [2] | [3] | | | +-----+-----+-----+-----+ +-----+ | | +-----+-----+-----+-----+ |a[1] | -> | [0] | [1] | [2] | [3] | | | +-----+-----+-----+-----+ +-----+ | | +-----+-----+-----+-----+ |a[2] | -> | [0] | [1] | [2] | [3] | | | +-----+-----+-----+-----+ +-----+

    n Java tablourile bidimensionale sunt implementate ca tablou monodimensional de tablouri monodimensionale. Declararea i alocarea unui tablou bidimensional De exemplu, tabla pentru tic-tac-toe. Va avea (ntr-un caz foarte limitat) trei rnduri primul indice i trei coloane al doilea indice i va conine un int n fiecare element. int[][] board = new int[3][3];

    Valori iniiale Se pot asigna valori iniiale tabloului la declararea ntr-un mod foarte asemntor cu cel pentru tablourile monodimensionale. Dimensiunile sunt calculate din numrul de valori. int[][] board = new int[][] {{0,0,0},{0,0,0},{0,0,0}};

    Trebuie s dai o valoare unui element nainte de a-l folosi, fie printr-o iniializarea, fie printr-o asignare. Exemplu desenarea tablei de tic-tac-toe

  • M. Joldo ndrumtor de laborator 5. Clase, obiecte i tablouri

    U.T. Cluj-Napoca Programare orientat pe obiecte 7

    Adesea este cel mai uore s se foloseasc tablourile bidimensionale cu bucle for imbricate. Spre exemplu, codul care urmeaz deseneaz tabla de tic-tac-toe printr-o metod paint. Codul presupune c o celul are latura de 10 pixeli i c un numr pozitiv nseamn un X, iar unul negativ reprezint un O. for (int row=0; row