Sunteți pe pagina 1din 33

Curs 2

https://docs.oracle.com/javase/tutorial/java/javaOO/index.html

http://pages.cs.wisc.edu/~cs368-2/JavaTutorial/NOTES/Java-Classes.html

https://www.cs.utexas.edu/~scottm/cs307/codingSamples.htm
Atentie toate temele/aplicatiile se vor trimite la adresa: teme@infrasoft.ro
Tipuri de date
In Java tipurile de date se impart in doua categorii: tipuri primitive si tipuri
referinta.
Tipuri primitive
aritmetice
intregi: byte (1 octet), short (2), int (4), long (8)
reale: float (4 octeti), double (8)
caracter: char (2 octeti)
logic: boolean (true si false)
Tipuri de referinta
vectorii;
clasele;
interfetele;
Valoarea unei variabile de acest tip este o referinta (adresa de memorie).
Variabile
Variabilele pot fi de tip primitiv sau referinte la obiecte (tip referinta).
Declararea variabilelor: Tip numeVariabila;
Initializarea variabilelor: Tip numeVariabila = valoare;
Declararea constantelor: final Tip numeVariabila;
In functie de locul in care sunt declarate, variabilele se impart in urmatoatele
categorii:
Variabile membre, declarate in interiorul unei clase;
Parametri metodelor, vizibili doar in metoda respectiva;
Variabile locale, declarate intr-o metoda, vizibile doar in metoda respectiva.
Variabile locale, declarate intr-un bloc de cod, vizibile doar in blocul
respectiv.
Definirea claselor
- in Java este obligatorie definirea a cel putin unei clase (clasa de baza);
- nu este obligatorie crearea unei instante a clasei de baza, caz in care se vor
utiliza date si metode statice.
Sintaxa unei clase:
[modificator] class NumeClasa

{
Corpul clasei;
}
Modificatorii pot fi:
- public : poate fi folosita din orice alta clasa, indiferent de pachetul in care
se gaseste.
- abstract : este incomplet definita ; nu poate fi instantiata, fiind folosita
doar pentru a crea un model comun pentru o serie de subclase.
- final : nu se mai pot defini subclase.
Obs : daca modificatorul lipseste, clasa este implicita si poate fi folosita doar de
clasele care se afla in accelasi pachet.
Corpul unei clase contine:
Declararea si/sau initializarea variabilelor de instanta si de clasa (variabile
membre).
Declararea si implementarea constructorilor;
Declararea si implementarea metodelor de instanta si de clasa (metode
membre).
Declararea unor clase imbricate (interne).
Observatie : implementarea metodei unei clase trebuie sa se faca
obligatoriu in corpul clasei.
Declararea datelor membre
Variabilele membre ale unei clase se declara de obicei inaintea metodelor.
O variabila se declara astfel:
[modificatori] Tip numeVariabila [ = valoareInitiala ];
unde un modificator poate fi :
un modificator de acces : public, protected, private
unul din cuvintele rezervate: static, final;
Static: variabila este de clasa si nu de instanta;
static tip variabilaClasa;
Final: indica faptul ca valoarea variabilei nu mai poate fi schimbata
(declararea constantelor ).
final double PI = 3.14 ;
Exemplu simplu:
public class BicycleDemo {
public static void main(String[] args) {
// Creeaza doua obiecte de tip Bicycle
// Bicycle este tipul zonei de memorie
Bicycle bike1 = new Bicycle();
Bicycle bike2 = new Bicycle();

// bike1 numele instantei, new - operatorul de instantiere ,iar Bicycle(); este- constructor
implicit; se putea crea obiectul si: Bicycle bike1;
As fi putut face definirea si in urmatorul fel:

// Apeleaza metodele pentru aceste obiecte


bike1.changeCadence(50);
bike1.speedUp(10);
bike1.changeGear(2);
bike1.printStates();
bike2.changeCadence(50);
bike2.speedUp(10);
bike2.changeGear(2);
bike2.changeCadence(40);
bike2.speedUp(10);
bike2.changeGear(3);
bike2.printStates();
}
}
class Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;//atribute
//metode
void changeCadence(int newValue) {
// int newValue parametru formal, care la apelul metodei va fi inlocuit cu
parametru efectiv
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadenta:"+cadence+" viteza:"+speed+" treapta:"+gear);
}

}
Constructorii unei clase
- sunt metode speciale care au aceelasi nume cu cel clasei, nu
returneza nici o valoare si sunt folosite pentru initializarea obiectelor clasei;
- o clasa poate avea mai multi constructori care trebuie sa difere prin lista
argumentelor;
- daca in clasa nu se declara nici un constructor, sistemul ii creaza automat
un constructor implicit.
Tipuri de constructori:
- fara argumente;
- cu argumente;
Declararea metodelor:
- Metodele sunt responsabile cu descrierea comportamentului unui obiect.
- Metodele se pot gasi doar in cadrul claselor.
O metoda se declara astfel:
[modificatori] TipReturnat numeMetoda ( [argumente] )
{// Corpul metodei}
unde un modificator poate fi :
un specificator de acces : public, protected, private .
unul din cuvintele rezervate: static, abstract, final.
Unde:
static : metoda este de clasa si nu de instanta;
abstract : metoda care nu are implementare si trebuie obligatoriu sa faca
parte dintr-o clasa abstracta;
final : metoda nu mai poate fi supradefinita in subclasele clasei in care a fost
definita.
Ciclul de viata al unui obiect
In limbajul Java argumentele sunt transmise doar prin valoare
- daca argumentul are tip primitiv de date, metoda nu ii poate schimba
valoare decat local;
- daca argumentul este de tip referinta, metoda nu poate modifica valoarea
referintei obiectului.
1. Crearea obiectelor
Crearea obiectelor se realizeaza prin instantierea unei clase si implica
urmatoarele lucruri:
Declararea
Presupune specificarea tipului acelui obiect, cu alte cuvinte specificarea
clasei acestuia

NumeClasa numeObiect;
Instantierea
Se realizeaza prin intermediul operatorului new si are ca efect crearea
efectiva a obiectului cu alocarea spatiului de memorie corespunzator.
numeObiect = new NumeClasa();
2. Folosirea obiectelor
Obiectul creat poate fi folosit in urmatoarele sensuri: aflarea unor informatii
despre obiect, schimbarea starii sale sau executarea unor actiuni.
obiect.NumeVariabila sau obiect.NumeMetoda(argument)
Operatorul . (punct) se numeste si operator de dereferentiere.

Observatie : programare orientata pe obiecte descurajeaza folosirea directa a


variabilelor unui obiect , in schimb, pentru fiecare variabila se pot definii metode
care sa permita schimbarea/aflarea valorilor (set_variabila si get_variabila).
obiect. x=3; // setare inconstienta
obiect.set_x =3; //metode setter
3. Distrugerea obiectelor
- in limajul Java programele nu mai au responsabilitatea distrugerii obiectelor.
- in momentul rularii unui program, ruleaza un proces care se ocupa cu
distrugerea obiectelor numit garbage collector (dispus pe platforma de lucru
Java).
- un obiect este eliminat din memorie atunci cand nu mai exista nici o
referinta la acesta.
Domeniul de vizibilitate al variabilelor si metodelor member
Exista patru niveluri de acces : public, protected, implicit si private.
O variabila/metoda membra de clasa se poate accesa doar daca tipul de clasa
este accesibil.
a). daca membrul este declarat public se permite accesul de oriunde;
b). daca membrul este declarat protected atunci accesul este permis doar daca:
- accesul este cerut din pachetul clasei in care este declarat;
- accesul apare dintr-o subclasa a clasei.
c). daca membrul este declarat private atunci accesul este permis doar in cadrul
clasei;
d). daca membrul este implicit accesul este permis doar din pachetul in care este
declarat tipul.

Aplicatie:
Fie pachetul Matematica ce contine clasele complex si dreptunghi

REZULTAT:

Extinderea claselor
- Java permite doar mostenirea simpla - o clasa poate avea un singur parinte
(superclasa).
- o clasa poate avea un numar nelimitat de subclase;
- radacina arborelui este clasa Object din pachetul java.lang
Sintaxa extinderii:
class clasa1 extends clasa2
unde clasa1 este subclasa si clasa2 este superclasa.
- relatia de derivare a claselor este tranzitiva.
class C1{int x;}
class C2 extends C1{int y;}
C1 este clasa derivata din clasa Object si este supercalasa pentru clasa C2.
Clasa C2 este subclasa directa a clasei C1 si subclasa indirecta a clasei
Object.
Clasa Object
- in limbajul Java, clasa Object este superclasa pentru toate clasele.
Clasa Object defineste si implementeaza comportamentul comun al tuturor
celorlalte clase Java prin metode specifice:
returnarea clasei din care face parte un obiectul curent:
getclass( )
reprezentarea obiectiului curent intr-un String:
toString( )
exemplu:
class Curs_2 {
public static void main(String args[])
{
String ob="abc";
System.out.println(ob.getClass());
System.out.println(ob.getClass().getClass());
}
}

Constructorii subclaselor
Instantierea unui obiect din clasa extinsa implica instantierea unui obiect din clasa
parinte.
Fiecare constructor al subuclasei trebuie sa aiba un constructor cu aceeasi
signatura in parinte sau sa apeleze explicit un constructor al clasei extinse.
Apelul explicit al unui constructor din superclasa se realizeaza cu expresia:
super([argumente])
Polimorfism
supraincarcarea (overloading) : in cadrul unei clase pot exista metode cu
acelasi nume cu conditia ca signaturile lor sa fie diferite.
supradefinirea (overriding): o subclasa poate rescrie o metoda a clasei parinte
prin implementarea unei metode cu acelasi nume si aceeasi signatura ca ale
superclasei.
Observatii:
- o metoda supradefinita poate sa ignore codul din superclasa sau poate sa il
extinda prin expresia super.
- o metoda nu poate supradefini o metoda declarata final in clasa parinte.
- in Java nu este posibila supraincarcarea operatorilor.
Modificatorii de aces
- o subclasa mosteneste de la parintele sau toate variabilele si metodele care nu
sunt private.

Variabile de instanta si de clasa


O clasa Java poate contine doua tipuri de variabile si metode :
de instanta: specifice fiecare instante create dintr-o clasa .
de clasa: declarate cu modificatorul static, specifice clasei.

class Exemplu {int x ; //variabila de instanta};


- la fiecare creare a unui obiect al clasei Exemplu sistemul aloca o zona de
memorie separata pentru memorarea valorii lui x.
Exemplu o1 = new Exemplu();
o1.x=100;
Exemplu o2 = new Exemplu();
o2.x = 200;
System.out.println(o1.x); // Afiseaza 100
System.out.println(o2.x); // Afiseaza 200 ;
- pentru variabilele de clasa (statice) sistemul aloca o singura zona de memorie la
care au acces toate instantele clasei respective;
- daca un obiect modifica valoarea unei variabile statice ea se va modifica si
pentru toate celelalte obiecte;
- variabilele statice pot fi referite si sub forma:
NumeClasa.numeVariabilaStatica
class Exemplu {
static long n =2; // Variabila de clasa}
Exemplu o1 = new Exemplu();
Exemplu o2 = new Exemplu();
o1.n = 100;
System.out.println(o2.n); // Afiseaza 100
Metode de instanta si de clasa
- metodele declarate fara modificatorul static sunt metode de instanta iar cele
declarate cu static sunt metode de clasa.
Diferente intre cele doua tipuri de metode:
metodele de instanta opereaza atat pe variabilele de instanta cat si pe cele
statice ale clasei;
metodele de clasa opereaza doar pe variabilele statice ale clasei.

//import java.util.Scanner;

//clasa Test_punct

Tablouri
- tabloul este un obiect creat dinamic care poate fi assignat variabilelor de tip
Object;
- toate elementele unui tablou au aceelasi tip;
Declararea vectorului
Se realizeaza prin expresii de forma:
Tip[] numeVector;
Tip numeVector[];
Exemplu:
int[] intregi;
String adrese[];

- delararea unui tablou nu creaza obiectul tablou si nici nu aloca spatiu de memorie
pentru componente;
Instantierea unui tablou
Operatia de alocare a memoriei se realizeaza prin intermediul operatorului
new
numeVector = new Tip[nrElemente];
- in urma instantierii vor fi alocati:
nrElemente * dimensiune(Tip) octeti necesari pentru memorarea
elementelor din vector;
v = new int[10];
//aloca spatiu pentru 10 intregi: 40 octeti
c = new char[10];
//aloca spatiu pentru 10 caractere: 20 octeti
Intializarea (optional)
- dupa declararea unui vector, acesta poate fi initializat, caz in care nu mai
este instantiat (alocarea memoriei se realizeaza automat).
String culori[] = {"Rosu", "Galben", "Verde"};
int []factorial = {1, 1, 2, 6, 24, 120};
Tabluri mutidimensionali
- tablourile multidimensionale sunt vectori de vectori;
Tip matrice[][] = new Tip[nrLinii][nrColoane];
- matrice[i] este linia i din matrice si reprezinta un vector cu nrColoane
elemente.
Operatii asupra unui tablou
- dimeniunea unui tablou se poate calcula cu ajutorul variabilei length.
int []a = new int[5];
// a.length are valoarea 5
int m[][] = new int[5][10];
// m[0].length are valoarea 10
- copierea unui vector se poate realiza fie element cu element, fie cu
ajutorul metodei System.arraycopy
int a[] = {1, 2, 3, 4};
int b[] = new int[4];
for(int i=0; i<a.length; i++)
b[i] = a[i];
Echivalent cu : System.arraycopy(a, 0, b, 0, a.length);
Clasa java.util.Arrays ofera metode utile pentru prelucrarea unui vector cum ar
fi:
sort - sorteaza ascendent un vector, folosind un algoritm de tip Quick-Sort
performant, de complexitate O(n log(n)).
int v[]={3, 1, 4, 2};

java.util.Arrays.sort(v);
// Sorteaza vectorul v
// Acesta va deveni {1, 2, 3, 4}
binarySearch - cautarea binara a unei anumite valori intr-un vector sortat;
equals - testarea egalitatii valorilor a doi vectori.
Exemplu

Siruri de caractere
In Java, un sir de caractere poate fi reprezentat astfel:
-printr-un vector format din elemente de tip char;
-un obiect de tip String;
-un obiect de tip StringBuffer
Exemple echivalente de declarare a unui sir:
String s = "abc";
String s = new String("abc");
char data[] = {a, b, c};
Obiecte de tip String

Reguli fundamentale privind obiectele de tip String:


obiectele de tip String se comporta ca orice alt obiect Java, exceptand faptul
ca asupra lor se poate aplica operatorul de concatenare;
obiectele de tip String sunt nemodificabile (sunt constante): daca doua
variabile referinta indica acelasi sir de caractere, modificarea valorii sirului
de caractere catre care refera una din variabile nu va avea nici un efect
asupra valorii sirului de caractere pe care o refera cealalta variabila.
String sir=Primul sir;
sir= Al doilea sir
- daca se atribuie unei variabile de tip String o alta valoare, vechea referinta
se pierde;
daca un sir se intializeaza cu un literal String, atunci i se va atribui adresa
acestuia din memorie (tabela de literali literal pool);
operatorul == aplicat pentru doua String uri testeaza daca acestea ponteaza
catre aceeasi adresa de memorie;
utilizarea operatorului new pentru un String conduce la crearea unui spatiu
de memorie;
Crearea de noi obiecte de tip String folosind constructorii clasei String
Clasa String se afla in pachetul java.lang.
1. Constructor utilizat pentru alocarea unui nou String care contine o
secventa de caractere stocata intr-un tablou unidimensional de caractere.
Antetul constructorului este:
public String(char[] <valoare>)
- <valoare> - tabloul de caractere care reprezinta sursa secventei de caractere a
noului String.
Exemplu:
char[] caractere1 = {a, b, c, d, e, f};
String sir1 = new String(caractere1);
2. Constructor utilizat pentru alocarea unui nou String care contine o secventa de
caractere stocata intr-o portiune a unui tablou unidimensional de caractere.
public String(char[] <valoare>, int <deplasament>, int <lungimeSecventa>)
- <valoare> - tabloul de caractere care reprezinta sursa secventei de caractere
a noului String;
- <deplasament> - indexul primului caracter din tabloul de caractere de la care
se va incepe initializarea noului String;
- <lungimeSecventa> - lungimea secventei de caractere preluata din tabloul
de caractere pentru initializarea noului String.
.Exemplu:
char[] caractere1 = {a, b, c, d, e, f};
String sir1 = new String(caractere1, 0, 3);

3. Constructor utilizat pentru alocarea unui nou String care contine aceeasi
secventa de caractere care este stocata intr-un alt sir.
public String(String <sirOriginal>)

- <sirOriginal> - sirul care este copiat in noul sir creat.


Exemplu:

char[] caractere1 = {a, b, c, d, e, f};

String sir1 = new String(caractere1);

String sir2 = new String(sir1);

Operatii asupra unui String


- Concatenarea sirurilor de caractere se face prin intermediul operatorului +
String s1 = "abc" + "xyz";
String s2 = "123";
String s3 = s1 + s2;
Metode publice din clasa String :
- boolean equals(object obiect);
- string replace(char caractervechi, char caracternou) ;
- String toLowerCase();
- String substring(int indexstart, int indexsfarsit)
- char[] toCharArray()
- char charAt(int index)

Exemplu:

Clasa StringBuffer
- prelucreaza siruri de caractere de lungime variabila;
- o instanta a clasei StringBuffer reprezinta un String care poate fi
modificat dinamic;
- un obiect de tip StringBuffer contine un bloc de memorie numit buffer
care poate sa contina un sir, dar nu este obligatoriu sa fie ocupat in totalitate;
- crearea unui obiect de tip StringBuffer se realizeaza apleland unul din
costructorii:
StringBuffer( ); //un sir cu capacitatea de 16 caractere

StringBuffer(int capacitate);
StringBuffer(String sir)
Exemplu : StringBuffer a = new StringBuffer(Un sir de tip buffer);
Metode publice din clasa StrindBuffer
int capacty();
StringBuffer delete(int start, int end);
StringBuffer replace(int start, int end, String sir);
int length();
String substring(int start);

Conversie de date
- conversia unui tip de date byte, short, int, float, double, char, boolean la un sir
de caractere se realizeaza cu metoda statica toString() .
- conversia unui sir de caractere String la un tip de data primitiva se realizeaza cu
metoda:
tip.parseTip(String sir);
Exemplu: int.parseInt(sir);
double.parseDouble(sir).

Exemplu

Clase si metode abstracte


- este utilizata pentru a definii un concept abstract folosit la dezvoltarea ulterioara a
altor clase ce pot fi instantiate;
- o clasa abstracta nu poate fi instantiata;
- o clasa abstracta pune la dispozitia subclaselor sale un model complet pe
care trebuie sa il implementeze.
Declararea unui clase abstracte:
[public] abstract class ClasaAbstracta
{// Declaratii uzuale
// Declaratii de metode abstracte
}

- poate avea specificatorul public caz in care poate fi extinsa de orice clasa
din afara pachetului;
- poate contine date membre la care se adauga declaratii de metode
neimplementate.
- clasa care extinde o clasa abstracta trebuie sa implementeze metodele
neimplementate din clasa abstracta.
- daca o clasa nu implementeaza metodele neimplementate este deasemenea
abstracta si nu poate fi instantiata.
Metode abstracte
Metodele fara nici o implementare se numesc metode abstracte si pot fi incluse
doar in clase abstracte.
In fata unei metode abstracte trebuie sa apara obligatoriu cuvantul cheie
abstract, altfel va fi furnizata o eroare de compilare.
abstract class ClasaAbstracta {
abstract void metodaAbstracta(); // Corect
void metoda(); // Eroare}
OBSERVATII
O clasa abstracta poate sa nu aiba nici o metoda abstracta.
Orice clasa care are o metoda abstracta trebuie declarata ca fiind abstracta.
Platforma de lucru Java cuprinde numeroase exemple de ierarhii care
folosesc la nivelele superioare clase abstracte:
Number: superclasa abstracta a tipurilor referinta numerice;
Reader, Writer: superclasele abstracte ale fluxurilor de intrare/iesire pe
caractere;
InputStream, OutputStream: superclasele abstracte ale fluxurilor de
intrare/iesire pe octeti;
AbstractList, AbstractSet, AbstractMap: superclase abstracte pentru
structuri de date de tip colectie.

Aplicatie complexa
package clase;
public abstract class fig_geo
{
String nume;
public fig_geo(String nume)
{
this.nume=nume; }
public abstract double arie();
@Override
public String toString()
{
return nume + " " + arie();
} }

package clase;
public class cerc extends fig_geo
{
double raza;
public cerc(double raza)
{
super("Cerc");
this.raza=raza;
}
@Override
public double arie()
{
return Math.PI*raza*raza;
}

package clase;
public class dreptunghi extends fig_geo
{
double L,l;
public dreptunghi(double L,double l)
{
super("Dreptunghi");
this.L=L;
this.l=l;
}
public double arie()
{
return L*l;
}
}
import java.util.Scanner;
import clase.*;
public class Test_clase_extends
{
static Scanner in=new Scanner(System.in);
static int n;
public static void main(String args[])
{
System.out.print("Cate figuri doresti sa introduci?: ");
n=in.nextInt();
fig_geo elem[]=new fig_geo[n];
for(int i=0;i<n;i++)
elem[i]=citire();

for(int i=0;i<n;i++)
System.out.println(elem[i]);
}
public static fig_geo citire() //metoda care intoarce obiectul grafic citit de la tastatura
{
String nume;
double raza,L,l;
System.out.print("Apasa 'c' pentru a defini un cerc si 'd' pentru a defini un dreptunghi:
");
do
{
nume=in.nextLine();
}
while(nume.length()==0);
switch(nume.charAt(0))
{
case 'c':
System.out.println("Cerc ");
System.out.println("Raza: ");
raza=in.nextDouble();
return new cerc(raza);
case 'd':
System.out.println("Dreptunghi");
System.out.println("Lungime:");
L=in.nextDouble();
System.out.println("Latime:");
l=in.nextDouble();
return new dreptunghi(L,l);
default:
System.out.println("Eroare obiect nul");
return new cerc(0.0);
}
}
}

Interfete
Interfetele permit, alaturi de clase, definirea unor noi tipuri de date.
O interfata Java este o colectie de constante si metode fara
implementare.

O clasa care implementeaza o interfata trebuie obligatoriu sa specifice


implementari pentru toate metodele interfetei.
Definirea unei interfete
Definirea unei interfete se face prin intermediul cuvantului cheie interface:
[public] interface NumeInterfata
[extends SuperInterfata1, SuperInterfata2...]
{ Corpul interfetei:}
O interfata poate avea doar modificatorul public.
O interfata poate extinde oricate interfete. Acestea se numesc
superinterfete si sunt separate prin virgula.
Corpul unei interfete poate contine:
constante: acestea pot fi sau nu declarate cu modificatorii public, static si
final care sunt impliciti;
-nici un alt modificator nu este permis in declaratia unei variabile dintr-o
interfata.
Constantele unei interfete trebuie obligatoriu initializate.
interface Exemplu {
int MAX = 100;
// Echivalent cu:
public static final int MAX = 100;
int MAX; // Incorect, lipseste initializarea
private int x = 1;// Incorect, modificator nepermis
}
metode fara implementare: acestea pot fi sau nu declarate cu modificatorul
public, care este implicit;
- nici un alt modificator nu este permis in declaratia unei metode a unei
interfete.
interface Exemplu {
void metoda();
// Echivalent cu:
public void metoda();
protected void metoda2(); // Incorect, modificator nepermis
Implementarea unei interfete
Implementarea uneia sau mai multor interfete de catre o clasa se face prin
intermediul cuvantului cheie implements:
class NumeClasa implements NumeInterfata
sau
class NumeClasa implements Interfata1, Interfata2, ...
O clasa poate implementa mai multe interfete.
Modificarea unei interfete implica modificarea tuturor claselor care
implementeaza acea interfata.

Mostenire multipla prin interfete


- in limbajul Java nu este permisa mostenirea multipla a claselor;
- o clasa poate avea oricate subclase dar numai o superclasa;
- o clasa poate extinte mai multe interfete.
class NumeClasa implements Interfata1, Interfata2, ...
Interface NumeInterfata extends Interfata1, Interfata2, ...
O interfata mosteneste atat constantele cat si declaratiile de metode de la
superinterfetele sale.
O clasa mosteneste doar constantele unei interfete si responsabilitatea
implementarii metodelor sale.

EXCEPTII

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