0% found this document useful (0 votes)
9 views

Curs 02

Uploaded by

ViciSeptentrion
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
9 views

Curs 02

Uploaded by

ViciSeptentrion
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 42

CURS02: CLASE.

MODELUL DE MEMORIE.
Alexandru Olteanu
{[email protected]}
int x; // tip de date primitiv
MyClass myobject ; // tip de date structurat , clasa

Clasele sunt tipuri de date structurate, ce contin


membrii (date si metode)
Obiectele sunt instante ale claselor
CE POATE CONTINE O
CLASA?
class Point2D {
int x;
int y;

void print() {
cout<<"("<<this.x<<","<<this.y<<")"<<endl;
}
}

// ... maybe in different file(s), far far away


Point2D p = new Point2D();
p.print();
class Point2D {
int x;
int y;

void print() {
System.out.println("("+this.x+","+this.y+")")
}
}

// ... maybe in different file(s), far far away


Point2D p = new Point2D();
p.print();
CE FACE CODUL SCRIS ASA SA FIE ..
mai usor de inteles?
mai usor de depanat?
mai usor de extins?
mai usor de testat?
Asocierea datelor si metodelor in clase se
potriveste cu TDA
Tipurile de date abstracte (TDA) sunt modele
pentru a defini tipuri de date în funcție de
comportamentul acestora (valori posibile, axiome,
operații).
campuri / proprietati
metode
constructori
accesori (setter si getter)
specificatori de acces
SPECIFICATORI DE ACCES
public - permite acces complet din exteriorul
clasei curente
private - limiteaza accesul doar în cadrul clasei
curente
protected - limiteaza accesul doar în cadrul clasei
curente, al altor clase din acelasi pachet sau al
descendentilor* ei
(default) - în cazul în care nu este utilizat explicit
nici unul din specificatorii de acces de mai sus,
accesul este permis doar în cadrul pachetului
(package private)
class Point2D {
private int x;
private int y;

public void print() {


System.out.println("("+this.x+","+this.y+")")
}
}
class GeneratorNume {
private String [] vocabular = {
new String ("Ana") ,
new String (" Mihai ") ,
new String (" Robert ")
};
private Random randomGenerator = new Random () ;

public String genNume () {


return vocabular [ randomGenerator . nextInt (3) ];
}
}
...
GeneratorNume gn = new GeneratorNume () ;
System.out.println(gn.genNume () ) ;
ÎNCAPSULAREA
este proprietatea claselor de obiecte de a grupa
datele si metodele aplicabile asupra datelor si felul
in care acestea sunt expuse sau nu in afara clasei.
Totodata, aceasta determina si protejarea datelor
si metodelor fata de utilizarea eronata.
SETTER / GETTER (ACCESSOR)
class Point2D {
private int x;
private int y;

public void setX(int x) {


this.x = x;
}

public int getX() {


return x;
}
}
De ce sa folosim Setter/Getter?
Pot exista nivele de acces diferite pentru setter si
getter (sau chiar unul sa nu existe)
public class Employee {
private int salary ;
public int getSalary () {
return salary ;
}
protected void setSalary (int salary ) {
this . salary = salary ;
}
}
De ce sa folosim Setter/Getter?
Se poate ascunde reprezentarea intern :
public class Employee {
private String street ;
private int number ;
private String city ;

public int getAddress () {


return street +", "+ number +", "+ city ;
}
}
De ce sa folosim Setter/Getter?
Se pot face validari:
public class Employee {
private String email ;
public void setEmail ( String email ) {
if (! EmailChecker.isValid ( email ) ) {
System.out.println ( email ) ;
} else {
this.email = email ;
}
}
}
De ce sa folosim Setter/Getter?
Se pot face conversii:
public class Employee {
private float height ;
public void setHeight ( float height , String measure ) {
if (! measure . equals ("m") ) {
this.height = height / 0.3048;
} else {
this.height = height ;
}
}
}
Boilerplate code
In C#:
public abstract class University {
public virtual string name { get; set; }
}

In Java:
@Getter
@Setter
public class University {
String name;
}

Project Lombok
CONSTRUCTORI
Default constructor
Parameterized constructor
Copy constructor
Destructor
Default constructor (no-arg constructor): provides
the default values to the object like 0, null etc.
depending on the type
public class Magazin {
private String brand ;
public Magazin () {
brand = "de inchiriat ";
}
}
...
Magazin item = new Magazin () ;
Parameterized constructor: provide different
values to the distinct objects
public class Magazin {
private String brand ;
public Magazin ( String brand ) {
this.brand = brand ;
}
}
...
Magazin item = new Magazin (" IKEA ") ;
A class can have any number of constructors that
differ in parameter lists. The compiler
differentiates these constructors by taking into
account the number of parameters in the list and
their type
public class Magazin {
private String brand ;
private Integer suprafata ;
public Magazin ( Integer suprafata ) {
this.suprafata = suprafata ;
this.brand = "de inchiriat ";
}
public Magazin ( Integer suprafata , String brand ) {
this.suprafata = suprafata ;
this.brand = brand ;
}
}
In Java, there is no Copy Constructor per-se, but
there are many ways to copy the values of one
object into another:
By constructor
By assigning the values of one object into
another
By clone() method of Object class
public class Training {
private int pushups ;
private int crunches ;
public Training ( Training otherTraining ) {
this . pushups = otherTraining . pushups ;
this . crunches = otherTraining . crunches ;
}
}
In C++, destructorul se apeleaza la iesirea din scope
a variabilei:
class Catalog {
private :
int * note ;
public :
Catalog (int count = 20) {
note = new int [ count ];
}
~Catalog () {
delete [] note ;
}
};
int main () {
Catalog * grupa321CD = new Catalog (30) ; // -> constructor
...
delete grupa321CD ; // -> destructor
}
In C++, destructorul se apeleaza la iesirea din scope
a variabilei:
class Catalog {
private :
int * note ;
public :
Catalog (int count = 20) {
note = new int [ count ];
}
~Catalog () {
delete [] note ;
}
};
int main () {
Catalog * grupa321CD = new Catalog (30) ; // -> constructor
...
//delete grupa321CD ;
} // -> destructor
In Java exista functia finalize, dar cu adevarat nu
stim cand este apelata pentru ca de gestiunea
memoriei se ocupa Garbage Collector
Java Garbage Collection Basics (Oracle)
MODELUL DE
MEMORIE
Pointeri vs Referinte in C/C++
int x = 13 , y = 14;
int *px = &x, &rx = x;
int *px , &rx; // eroare : referintele sunt initializate la crea
px = &y; rx = y; // nu se modifica referinta , ci variabila refe
px ++; rx++; // nu se modifica referinta , ci variabila referita
Pointeri vs Referinte in C/C++
void swap (int first, int second) {
int temp = first; first = second; second = temp;
}

void swap (int* first, int* second) {


int* temp = first; first = second; second = temp;
}

void swap (int* first, int* second) {


int* temp; *temp = *first; *first = *second; *second = *tem
}

void swap (int& first, int& second) { // doar in C++


int temp = first; first = second; second = temp;
}
In Java avem doar referinte, nu avem pointeri

source: jenkov.com
În Java, variabile din tipuri de date primitive pot fi
locale unei metode sau membrii unui obiect
public class Album {
public static void main ( String [] args ) {
int price ;
}
}

public class Album {


int price ;
public static void main ( String [] args ) {
}
}
variabilele locale nu sunt initializate
public class Album {
public static void main ( String [] args ) {
int price ;
price ++; // eroare de compilare
}
}

membrii claselor sunt initializati cu 0 sau null, în


functie de tip
public class Album {
int price ;
public static void main ( String [] args ) {
price ++; // no error, bad programming style
}
}
Pentru referintele la clase, la declararea fara
initializare se creeaz o referinta nula :
Magazin spatiuDeInchiriat;

La initializare, se aloca spatiu pe heap si se apeleaz


un constructor:
Magazin magazinSport = new Magazin (" Articole Sportive ") ;
Doua referinte la acelasi obiect: se modica obiectul
public Arena {
public int seats ;
Arena (int seats ) {
this . seats = seats ;
}
}

Arena arenaNationala = new Arena (55000) ;


stadionulNational = arenaNationala ;
stadionulNational.seats += 600;
System.out.println ( arenaNationala . seats ) ; // 55000 ? 55600
== tests for reference equality (whether they are
the same object)
.equals() tests for value equality (whether they
are logically "equal")
String name1 = new String (" Michael ");
String name2 = name1 ;
String name3 = new String (" Michael ") ;

System .out. println ( name1 == name2 ) ;


System .out. println ( name1 == name3 ) ;
System .out. println ( name1 . equals ( name3 ) ) ;
Sigur ati inteles?
public class MyProgram {
public static void main ( String args [])
{
Integer a = Integer . valueOf (1) ;
Integer b = Integer . valueOf (1) ;
System .out. println (a==b) ;
Integer x = Integer . valueOf (10001) ;
Integer y = Integer . valueOf (10001) ;
System .out. println (x==y) ;
}
}
Transferul parametrilor la apelul functiilor este
crucial pentru o functionare corecta:
variabile de tip primitiv se transfera prin copiere
pe stiva
orice modicare din functie a valorii variabilei
NU VA FI VIZIBILA
obiecte
se transfera prin referinta pe stiva
orice modicare din functie a referintei (e.g. p =
new Player()) NU VA FI VIZIBILA
Reading material
Lab01: Java Basics
Lab02: Constructori si Referinte
Memory Model
Rule of Three/Five/Zero

You might also like