Sunteți pe pagina 1din 9

Motenirea n Java Motenirea este un concept care aparine programrii orientate obiect, unde toate clasele sunt aranjate

ntr-o ierarhie strict. Fiecare clas din aceast ierarhie are o superclas (clase care se afl deasupra n ierarhie) i un numr de subclase (clase care se afl dedesupt n ierarhie). Prin motenire o clas poate fi reutilizat pentru a modela o alt clas care este o specializare a celei dinti. Prima clas se numete clas de baz (sau superclas sau clas printe), iar cea de-a doua, clas derivat (sau subclas). Clasele derivate motenesc atributele i comportamentul de la superclasele sale, constructorii nu se motenesc. Deci se poate spune c un obiect din clasa derivat este i un obiect de tipul clasei de baz. Pe lng atributele i metodele pe care le motenete de la clasa de baz, clasa derivat poate s adauge altele noi. Pentru a specifica faptul c o subclas motenete o clas de baz, n Java se utilizeaz urmtoarea construcie: [lista_Modificatori] class idClasa extends idClasaBaza { // corp_clasa; } O clas poate avea o singur clas de baz. Exemplu: class Parinte { public int a; public double b; public void f() { System.out.println(metoda f); } public void g() { System.out.println(metoda g); } } class A extends Parinte { public String c; public void h() { System.out.println(metoda h); } } n aceste condiii urmtoarea secven este corect: A obA=new A(); obA.a=10; obA.b=9.9; obA.c=Test; obA.f();

obA.g(); obA.h(); Observaii: 1. Nu pot fi accesate din clasa de baz dect membrii care au modificatorii de acces de tip public sau protected. 2. O relaie de derivare poate fi privit i ca o tip de incluziune: n interiorul instanei clasei derivate se afl inclus un obiect din clasa de baz. Instana clasei de baz poate fi referniat prin cuvntul super. Spre deosebire de metode, constructorii claselor de baz nu se motenesc n clasele derivate. Ca urmare o clas derivat va avea proprii si constructori. n cazul n care clasa derivat nu are declarat nici un constructor n programul surs, compilatorul va aduga un constructor fr argumente i care nu face nimic (acest lucru este valabil pentru orice clas). Fiecare constructor al clasei derivate apeleaz un constructor al clasei de baz n mod implicit (adugat de compliator) sau explicit prin folosirea unui apel de forma super(lista_argemente). Suprancarcarea i supradefinirea sunt dou concepte utile n programarea orientat obiect, se cunosc sub denumirea de polimorfism i se refer la:

suprancarcarea (overloading): n cadrul unei clase pot exista metode cu acelai nume dar cu signaturile diferite, astfel nct la apelul funciei cu acel nume s se poat stabili n mod unic care dintre ele se execut. supradefinirea (overriding): o subclas a unei clase poate rescrie o metod a clasei printe, prin implementarea unei metode cu acelai nume i aceeai signatur ca ale superclasei.

O metod supradefinit poate s: ignore complet codul metodei corespunztoare din superclas sau s extind codul metodei printe, executnd nainte de codul propriu i funcia printe. Exemplu: 1. class A { void metoda() { System.out.println("A: metoda fara parametru"); } //supraincarcare void metoda(int arg) { System.out.println("A: metoda cu un parametru "+arg); } } class B extends A { //supradefinire void metoda() { System.out.println("B: metoda fara parametru");

} } .................. B ob = new B(); ob.metoda(); -> afiseaza "B: metoda fara parametru" 2. class B extends A { //supradefinire prin extensie void metoda(int i) { super.metoda(i); System.out.println("B: metoda cu un parametru "+i); } } . B ob = new B(); ob.metoda(5); -> afiseaza : A: metoda cu un parametru 5 B: metoda cu un parametru 5 Polimorfismul este deci o caracteristic specific programrii orientate obiect i care este deosebit de util n crearea unor programe flexibile i fiabile i reprezint proprietatea unei metode de a se adapta n funcie de parametrii de apel i n special n funcie de tipul obiectului prin intermediul cruia este apelat.

Lucrul cu iruri de caractere Platforma Java pune la dispoziia programatorilor trei clase pentru a lucra cu date alfanumerice. Acestea sunt : 1. Character clas ale crei instane pot pstra o singur valoare caracter ; 2. String clas pentru lucrul cu date nemodificabile compuse din mai multe caractere ; 3. StringBuffer - clas pentru manipularea datelor modificabile compuse din mai multe caractere. Toate aceste clase se gsesc n pachetul java.lang. 3.5.1. Clasa Character O dat de tip Character se poate folosi n locul variabilei primitive char, atunci cnd este cerut un obiect. De exemplu, atunci cnd se paseaz o valoare caracter ntr-o metod care modific valoarea sau atunci cnd se paseaz o valoare caracter ntr-o structur de date, cum ar fi un vector, care cere obiecte.

Crearea unui obiect Character se realizeaz cu new: Character id_caracter=new Character('valoare'); Prezentm n continuare cteva metode din clasa Character: int compareTo(Character); - compar valorile pstrate de dou obiecte Character. Valoarea returnat de metod este un numr ntreg indicnd dac valoarea din obiectul curent este mai mare, egal cu, sau mai mic dect valoarea inut de argument. Exemplu: public class CompOb { public static void main(String args[]) { Character ob1=new Character('a'); Character ob2=new Character('v'); int diferenta=ob1.compareTo(ob2); if(diferenta==0) System.out.println("ob1 egal cu ob2"); else if(diferenta<0) System.out.println("ob1 mai mic decat ob2"); else System.out.println("ob1 mai mare decat ob2"); } } boolean equals(Object); - compar valoarea pstrat de obiectul curent cu valoarea pstrat de un altul. Metoda returneaz true dac valorile pstrate de ambele obiecte sunt egale i false n caz contrar. Exemplu: System.out.println("ob1 este "+((ob1.equals(ob2))?"egal cu":"diferit de")+" ob2"); String toString(); - este o metod de instan care convertete un obiect ntr-un ir. irul rezultat este de un caracter i conine valoarea pstrat de ctre obiectul Character. charValue(); - este o metod care returneaz valoarea pstrat de obiectul Character ca o valoare primitiv char. boolean isUpperCase(char); boolean isLowerCase(char); - determin dac valoarea primitiv char este liter mare, repectiv liter mic Exemplu: System.out.println("Caracterul "+a.toString()+" este "+ (Character.isUpperCase(a.charValue())?"litera mare":"litera mica"));

3.5.2. Clasa String Modul cel mai simplu de manipulare a obiectelor de tip String l constituie constantele String, care sunt iruri de caractere ncadrate de ghilimele ("). Orice referire a unei constante de acest tip n cadrul unui program Java are ca efect crearea unui obiect String care conine secvena de caractere respectiv. Exemplu: String s = "Acesta este un sir de caractere "; Crearea unei variabile String se face la fel ca i crearea celorlalte variabile sau folosind new. Exemple: String sir = "Primul sir"; String s1 = "un sir"; String s2 = new String(s1); String svid = new String( ); char[ ] tab = {'s','i','r'}; String s3 = new String(tab); Cnd se asigneaz un String ctre o alt valoare, vechea referin se pierde, valoarea sa urmnd a fi eliberat automat din memorie de ctre colectorul de gunoaie. irurile de caractere se pot obtine i prin diverse prelucrri ale unor iruri existente. n acest scop clasa String ofer un set de metode dintre care enumerm: String toUpperCase(); String toLowerCase(); String substring(int); String substring(int, int); Metodele clasei String includ i operaii care permit consultarea stringurilor, respectiv obinerea de informaii cu privire la coninutul lor: int length(); char charAt(int); int indexOf(char); int indexOf(String); int lastIndexOf(char); Obiectele de tip String nu se pot modifica dup ce au fost create. Operatorul "+" concateneaz dou sau mai multe iruri de caractere. Prin concatenare se instaniaz un nou obiect de tip String care va referenia un ir alctuit din irurile implicate n adunare. Exemplu: String sir1 = "Limbajul" ;

String sir2 =sir1+ "Java"; Operatorul "+" se asociaz de la stnga la dreapta. Operatorul "+" poate avea operanzi numai iruri sau un ir i un operand de orice alt tip. Dac un operand este String, atunci se convertete i celalalt la String, tipul rezultatului ntors fiind String. Exemplu: String sir3 = "cincizeci si cinci = " + 5 + 5; String sir4 = 5 + 5 + " = zece "; System.out.println(sir3 + " " + sir4); 3.5.3. Clasa StringBuffer O alt clas prezent n pachetul java.lang este StringBuffer, care reprezint tot un ir de caractere, dar spre deosebire de String, acesta se poate modifica. n mod tipic, clasa StringBuffer se folosete pentru a construi date de tip caracter n mod dinamic (de exemplu atunci cnd se citesc date text dintr-un fiier). Crearea unui obiect din clasa StringBuffer se realizeaz cu new: StringBuffer id_sir=new StringBuffer(lungime); Exemplu: String mesaj="Acesta este un sir constant"; int lungime=mesaj.length() ; StringBuffer altsir=new StringBuffer(lungime) ; Prezentm n continuare cteva metode ce pot fi folosite de obiecte de tip String i StringBuffer. int length( ); returneaz numrul de caractere coninute n obiectul String sau StringBuffer. char charAt(int index) ; - returneaz caracterul de la un indice specificat
0 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 18

A c e s t a

e s t

charAt(0) char c=charAt(5); String substring(int beginIndex, int endIndex); - returneaza un subir dintr-un ir.

charAt(length()-1)

Exemplu: String sir="abcdef"; String altsir=sir.substring(2,5); //altsir=="cde" Alte metode pentru clasa String: int indexOf(char caracter); returneaz poziia n ir a unui caracter, cutarea se face de la nceputul irului int indexOf(String); - returneaz poziia n ir a unui ir de caractere int lastIndexOf(char caracter) ; - returneaz poziia n ir a unui caracter, cutarea se face de la sfritul irului spre nceput. String toLowerCase(); - returneaz irul scris cu litere mici. String toUpperCase(); - returnaz irul scris cu litere mari. Alte metode pentru clasa StringBuffer: int capacity(); - returneaz cantitatea de spaiu alocat pentru un StringBuffer i nu cantitatea de spaiu folosit. StringBuffer append(char c); - adaug un caracter la sfritul irului destinaie. Exemplu: dest.append(sursa.charAt(i)); Observaie: exist mai multe metode append care adaug date de diferite tipuri, cum ar fi float, int, boolean sau chiar Object, la sfritul lui StringBuffer. Datele sunt convertite ntr-un ir, nainte ca operaia de adugare s aibe loc. Exemplu: StringBuffer s1=new StringBuffer(14); s1.append("Programare"); s1.append("Java"); StringBuffer insert(int index, char caracter);

StringBuffer insert(int index, String sir); - insereaz un caracter sau ir n interiorul unui StringBuffer, index reprezint indexul nainte de care se insereaz caracterul sau irul. Exemplu: StringBuffer s1=new StringBuffer("Exempl Java"); s1.insert(6,'u');System.out.println(s1); s1.insert(8,"sir ");System.out.println(s1); StringBuffer setCharAt(int index, char caracter); - nlocuiete caracterul de la o locaie specificat din StringBuffer cu caracterul specificat n lista de argumente; StringBuffer setLength(int nouaLung); - modific dimensiunea irului. Exemplu: StringBuffer s1=new StringBuffer(10); s1.append("Programare"); s1.setLength(2); // s1="Pr" Exemplu1 1. S se scrie un program care caut un subir preluat din linia de comanda ntr-un ir dat. (irul este constant) import java.util.*; class Caut { public static void main(String argv[]) { if (argv.length==0) return; String sir="Acesta este un sir."; System.out.println("s1: sirul constant: "+sir); System.out.println("s2: sirul preluat din linia de comanda: "+argv[0]); int k=sir.indexOf(argv[0]); if (k= =-1) System.out.println("s2 nu este subsir a lui s1"); else System.out.println("s2 incepe de la pozitia "+k); } } Exemplul 2. Pentru un ir preluat ca argument din linia de comand, s se afieze lungimea sa, s se nlocuiasc a cu A, s se afieze un subir al su, s se afieze clasa creia i aparine obiectul ir, s se afieze irul cu litere mari (mici). import java.util.*;

class Sirul { public static void main(String argv[]) { if (argv.length==0) return; StringBuffer s=new StringBuffer(argv[0]); System.out.println("Lungime: "+s.length()); for (int k=0; k<s.length(); ++k) if (s.charAt(k)=='a') s.setCharAt(k,'A'); System.out.println(s.toString()); System.out.println("Subsir:"+s.substring(s.length()/4,s.length()/2)); System.out.println(s.getClass()); System.out.println(s.toString().toUpperCase()+"\n"+s.toString().toLowerCase()+"\n"); } } Exemplul 3. S se stabileasc dac un caracter dat (preluat din linia de comand) aparine sau nu unui ir. Se vor preciza i poziiile unde apare caracterul. import java.util.*; class CautCar { public static void main(String argv[]) { if (argv.length==0) return; String s=new String("Acesta este sirul in care se cauta"); System.out.println(s); String s2=new String(argv[0]); for (int i=0; i<s.length(); ++i) if (s.charAt(i)==s2.charAt(0)) System.out.print(i+", "); System.out.println(); } }