Mostenirea in Java

12
Moştenirea în Java Moştenirea este un concept care aparţine programării 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 număr de subclase (clase care se află dedesupt în ierarhie). Prin moştenire o clasă poate fi reutilizată pentru a modela o altă clasă care este o specializare a celei dintâi. Prima clasă se numeşte clasă de bază (sau superclasă sau clasă părinte), iar cea de-a doua, clasă derivată (sau subclasă). Clasele derivate moştenesc atributele şi comportamentul de la superclasele sale, constructorii nu se moştenesc. Deci se poate spune că un obiect din clasa derivată este şi un obiect de tipul clasei de bază. Pe lângă atributele şi metodele pe care le moşteneşte de la clasa de bază, clasa derivată poate să adauge altele noi. Pentru a specifica faptul că o subclasă moşteneşte o clasă de bază, în Java se utilizează următoarea construcţie: [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

description

Mostenirea in Java - limbaj de programare JAVA

Transcript of Mostenirea in Java

Page 1: Mostenirea in Java

Moştenirea în Java

Moştenirea este un concept care aparţine programării 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 număr de subclase (clase care se află dedesupt în ierarhie). Prin moştenire o clasă poate fi reutilizată pentru a modela o altă clasă care este o specializare a celei dintâi. Prima clasă se numeşte clasă de bază (sau superclasă sau clasă părinte), iar cea de-a doua, clasă derivată (sau subclasă). Clasele derivate moştenesc atributele şi comportamentul de la superclasele sale, constructorii nu se moştenesc. Deci se poate spune că un obiect din clasa derivată este şi un obiect de tipul clasei de bază. Pe lângă atributele şi metodele pe care le moşteneşte de la clasa de bază, clasa derivată poate să adauge altele noi. Pentru a specifica faptul că o subclasă moşteneşte o clasă de bază, în Java se utilizează următoarea construcţie:

[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 condiţii următoarea secvenţă este corectă:A obA=new A();obA.a=10;obA.b=9.9;obA.c=”Test”;obA.f();

Page 2: Mostenirea in Java

obA.g();obA.h();Observaţii: 1. Nu pot fi accesate din clasa de bază decât membrii care au modificatorii de acces de tip public sau protected.2. O relaţie de derivare poate fi privită şi ca o tip de incluziune: în interiorul instanţei clasei derivate se află inclus un obiect din clasa de bază. Instanţa clasei de bază poate fi refernţiată prin cuvântul super.

Spre deosebire de metode, constructorii claselor de bază nu se moştenesc în clasele derivate. Ca urmare o clasă derivată va avea proprii săi constructori. În cazul în care clasa derivată nu are declarat nici un constructor în programul sursă, compilatorul va adăuga un constructor fără 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 (adăugat de compliator) sau explicit prin folosirea unui apel de forma super(lista_argemente). Supraîncarcarea şi supradefinirea sunt două concepte utile în programarea orientată obiect, se cunosc sub denumirea de polimorfism şi se referă la: supraîncarcarea (overloading): în cadrul unei clase pot exista metode cu acelaşi

nume dar cu signaturile diferite, astfel încât la apelul funcţiei 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 părinte, prin implementarea unei metode cu acelaşi nume şi aceeaşi signatură ca ale superclasei.

O metodă supradefinită poate să: ignore complet codul metodei corespunzătoare din superclasă sau să extindă codul metodei părinte, executând înainte de codul propriu şi funcţia

părinte.

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 {

//supradefinirevoid metoda() { System.out.println("B: metoda fara parametru");}

Page 3: Mostenirea in Java

}..................

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 5B: metoda cu un parametru 5

Polimorfismul este deci o caracteristică specifică programării 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 funcţie de parametrii de apel şi în special în funcţie de tipul obiectului prin intermediul căruia este apelată.

Lucrul cu şiruri de caractere

Platforma Java pune la dispoziţia programatorilor trei clase pentru a lucra cu date alfanumerice. Acestea sunt :

1. Character – clasă ale cărei instanţe pot păstra 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 găsesc în pachetul java.lang.

3.5.1. Clasa Character

O dată de tip Character se poate folosi în locul variabilei primitive char, atunci când este cerut un obiect. De exemplu, atunci când se pasează o valoare caracter într-o metodă care modifică valoarea sau atunci când 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:

Page 4: Mostenirea in Java

Character id_caracter=new Character('valoare');

Prezentăm în continuare câteva metode din clasa Character:

int compareTo(Character); - compară valorile păstrate de două obiecte Character. Valoarea returnată de metodă este un număr întreg indicând dacă valoarea din obiectul curent este mai mare, egală cu, sau mai mică decât 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 păstrată de obiectul curent cu valoarea păstrată de un altul. Metoda returnează true dacă valorile păstrate 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 converteşte un obiect într-un şir. Şirul rezultat este de un caracter şi conţine valoarea păstrată de către obiectul Character.

charValue(); - este o metodă care returnează valoarea păstrată 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"));

Page 5: Mostenirea in Java

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 conţine secvenţa 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);

Când se asignează un String către o altă valoare, vechea referinţă se pierde, valoarea sa urmând a fi eliberată automat din memorie de către colectorul de gunoaie.Şirurile de caractere se pot obtine şi prin diverse prelucrări ale unor şiruri existente. În acest scop clasa String oferă un set de metode dintre care enumerăm:

String toUpperCase(); String toLowerCase(); String substring(int); String substring(int, int);

Metodele clasei String includ şi operaţii care permit consultarea stringurilor, respectiv obţinerea de informaţii cu privire la conţinutul 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 instanţiază un nou obiect de tip String care va referenţia un şir alcătuit din şirurile implicate în adunare.

Exemplu: String sir1 = "Limbajul" ; String sir2 =sir1+ "Java";

Page 6: Mostenirea in Java

Operatorul "+" se asociază de la stânga 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 converteşte ş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 foloseşte pentru a construi date de tip caracter în mod dinamic (de exemplu atunci când se citesc date text dintr-un fişier).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) ;

Prezentăm în continuare câteva metode ce pot fi folosite de obiecte de tip String şi StringBuffer.

int length( ); – returnează numărul de caractere conţinute î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 10 11 12 13 14 15 16 17 18

A c e s t a e s t e u n t e s t

charAt(0) charAt(length()-1) char c=charAt(5);

String substring(int beginIndex, int endIndex); - returneaza un subşir dintr-un şir.

Exemplu:

Page 7: Mostenirea in Java

String sir="abcdef";String altsir=sir.substring(2,5); //altsir=="cde" Alte metode pentru clasa String:

int indexOf(char caracter); – returnează poziţia în şir a unui caracter, căutarea se face de la începutul şirului

int indexOf(String); - returnează poziţia în şir a unui şir de caractere

int lastIndexOf(char caracter) ; - returnează poziţia în şir a unui caracter, căutarea se face de la sfârşitul ş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 spaţiu alocată pentru un StringBuffer şi nu cantitatea de spaţiu folosit.

StringBuffer append(char c); - adaugă un caracter la sfârşitul şirului destinaţie. Exemplu: dest.append(sursa.charAt(i));Observaţie: există mai multe metode append care adaugă date de diferite tipuri, cum ar fi float, int, boolean sau chiar Object, la sfârşitul lui StringBuffer. Datele sunt convertite într-un şir, înainte ca operaţia de adăugare 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.

Page 8: Mostenirea in Java

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); - înlocuieşte caracterul de la o locaţie 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 subşir 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 afişeze lungimea sa, să se înlocuiască ‘a’ cu ‘A’, să se afişeze un subşir al său, să se afişeze clasa căreia îi aparţine obiectul şir, să se afişeze şirul cu litere mari (mici).

import java.util.*;class Sirul{ public static void main(String argv[]) { if (argv.length==0) return;

Page 9: Mostenirea in Java

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ă) aparţine sau nu unui şir. Se vor preciza şi poziţiile 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(); }}