structuri de date în java...

40
1 Structuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile membre. Crearea obiectelor Tipuri primitive. Constructori. Metode Controlul execuţiei Vectori. Probleme la utilizarea obiectelor Pachete. Reglementarea accesului Variabile. Referinţe Variabile membre statice. Metode statice Domeniu de existenţă

Upload: others

Post on 26-Dec-2019

27 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

1

Structuri de Date în JAVA (II)

● Programarea orientată obiect în Java● Clasă. Variabile membre. Crearea obiectelor● Tipuri primitive. Constructori. Metode● Controlul execuţiei● Vectori. Probleme la utilizarea obiectelor● Pachete. Reglementarea accesului● Variabile. Referinţe● Variabile membre statice. Metode statice● Domeniu de existenţă

Page 2: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

2

Programarea Orientată Obiect

● Obiectele au stare● o persoană este un obiect caracterizată de

nume, vârstă, CNP● Programatorii cheamă metodele obiectelor

pentru a realiza calcule şi a modifica această stare

● programator: ce vârstă ai?● obiect: am 22● programator: azi e ziua ta!● obiect: atunci îmi incrementez vârsta cu 1

Page 3: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

3

Un program JAVA

package hello;import java.util.System;class HelloWorld {

String myString;void shout () {

myString = new String (“Hello world”);System.out.println (myString);

}

public static void main (String[] args) {HelloWorld myHelloWorld = new HelloWorld ();myHelloWorld.shout ();

}}

Page 4: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

4

Clasă● Şablon pentru generarea obiectelor● Java e un limbaj orientat obiect, deci orice este o clasă

class HelloWorld { // numele clasei

... <definiţii de metode şi variabile membre> ...

}

Page 5: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

5

Variabilă membră

● Descrie starea obiectului

class Human {int age;

}

<tipul clasei> <numele variabilei>;

Page 6: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

6

Crearea obiectelor

Human bob = new Human ();

● Crearea obiectelor se face cu operatorul “new”● Obiectul = instanţă a clasei● bob este o referinţă la obiect (adresă)● Se asignează obiectul construit variabilei bob

<tip> <nume variabilă> = <obiect nou>;

Page 7: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

7

22

● De ce nu a trebuit să scriem

bob.age = new int (22); ??

Page 8: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

8

Tipuri primitive

● Nu orice este un obiect

● Unele lucruri sunt prea simple şi prea frecvent utilizate ca să le considerăm obiecte:

● boolean, short, byte, int, long, double, float, char

Page 9: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

9

Clase wrapper

● Tipurile primitive nu sunt clase derivate din clasa Object● Pentru a le trata similar cu obiectele le asociem clase● Clasa asociată unui tip primitiv se numeşte clasă wrapper

Constructor Accesor methodByte public Byte(byte value) public byte byteValue ()Short public Short(short value) public short shortValue()Integer public Integer(int value) public int intValue ()Long public Long(long value) public long longValue ()Float public Float(float value) public float floatValue ()Double public Double(double value) public double doubleValue ()Character public Character(char value) public char charValue ()Boolean public Boolean (boolean value) public boolean booleanValue ()

Wrapper class

Page 10: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

10

Folosirea claselor wrapper

int i = 42;int j;Integer example = new Integer (i); // example copiaza valoarea 42j = example.intValue (); // j este acum 42

Integer a = 2;Integer b = 12;Integer c = a + b; // este o absurditate;

// '+' nu se poate folosiint r = a.intValue () + b.intValue ();Integer d = new Integer (r); // varianta corectă

Page 11: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

11

Variabila membră myString

package hello;import java.util.System;class HelloWorld {

String myString;void shout () {

myString = new String (“Hello world”);System.out.println (myString);

}

public static void main (String[] args) {HelloWorld myHelloWorld = new HelloWorld ();myHelloWorld.shout ();

}}

Page 12: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

12

Metode

● Procesează starea obiectului

<tip returnat> <numele metodei> ( <parametri> ) {<corpul metodei>

}

myHelloWorld.shout ();// se foloseşte '.' pentru a accesa metoda

Page 13: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

13

Constructori

● Constructorii sunt metode speciale

● nu au tip returnat● se folosesc pentru a iniţializa variabilele

membre● primesc parametri, au corp al metodei, dar nu

au return

Page 14: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

14

Corpul metodei

String firstname (String fullname) {int space = fullname.indexOf (“ “);String word = fullname.substring (0, space);return word;

}

● oricâţi parametri● declară variabile locale● returnează un singur lucru (void = nu întorc nimic)

Page 15: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

15

Diferenţa între declaraţie şi definiţie// declarare variabilă c ca referinţă de tip clasă CutieCutie c; // variabila c are valoarea null...c = new Cutie (); // de-abia aici s-a creat obiectul

● Toate variabilele declarate au implicit valoarea 0● Referinţele se iniţializează tot cu 0 (null)● Dacă folosim o referinţă ne-creeată încă se va arunca o excepţie NullPointerException

Page 16: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

16

Cutie a;Cutie b;

a = new Cutie ();a.deschide ();

b = a;

b.deschide ();

nullCutie a Cutie b null

Cutie a Cutie b null

Cutie a Cutie b

Cutie a Cutie b

Page 17: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

17

Controlul execuţiei

if (bob.age < 21) { if (predicat) {// nu efectuează ...

} else if (bob.hasCard ()) { } else if (predicat2) {// fă altceva ...

} else { } else if (predicat3) {// în rest ...

} } else if (predicatN) {...

} else { ... }

Page 18: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

18

Predicate

● Predicatele se evaluează fie la true fie la false (boolean)

● <, >, ==, <=, >=, !

box.isEmpty ()box.numberBooks () == 0!(box.numberBook () > 1)box.numberBooks () != MAX_NUMBER_BOOKS

Page 19: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

19

Bucla for

for (int i = 0 ; i < 3 ; i ++) {System.out.println (i); // tipăreşte 0 1 2

}

for (<iniţializare> ; <predicat> ; <incrementare> ) {se execută de fiecare datăo singură dată

Oprirea se face în momentul când predicatul devine false.

Page 20: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

20

Bucla while

int i = 0;while (i < 3) {

System.out.println (i);i = i + 1;

}

while (<predicat>) {...

}

Page 21: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

21

Combinarea predicatelor

● && este ŞI logic● || este SAU logic

a. bob.age >= 21 && bob.hasCard ()b. !someone.name.equals(“Bob”)c. (!true || false) && true

Page 22: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

22

Vectori

● Vectorii sunt tot obiecte, dar speciale, precum tipurile primitive

String [] pets = new String [2];pets[0] = new String (“Fluffy”);pets[1] = “Spot”; // şirul există deja

String[] pets = new String [] {“Fluffy”, “Spot”};System.out.println (pets.length); // afişează 2

Page 23: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

23

Câte tipuri avem ?

● Primitive● int a = 3 + 5;

● Obiecte● Integer a = new Integer (3);● Integer sum = a.add (5);● Vectori

Page 24: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

24

Obiectele pot cauza probleme!

● pets[3] >> programul se opreşte, se aruncă excepţia ArrayOutOfBounds

● String[] str;● str.length >> oprire, aruncă NullPointerException

● Integer a = new Integer (3); // a primeşte 3● a.add (5); // a rămâne 3● a = a.add (5); // a primeşte 8

Page 25: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

25

Packages (pachete)● pachet – asamblează împreună mai multe clase (fişiere .java)● numele pachetului – domeniu Internet ce prefixează numele

ales, de exemplu: edu.colorado.simulations

package ro.unitbv.vega;/home/user/classes

ro unitbv

vega fişiere .java fişiere .class

export CLASSPATH=$CLASSPATH:/home/user/classes

Page 26: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

26

// Fisierul: Cutie.java// declararea pachetuluipackage ro.unitbv.vega;public class Cutie // această clasă se vede în afara{ // pachetului

// ...}

// Fisierul: TestCutie.java// declaratie de import pentru toate clasele pachetuluiimport ro.unitbv.vega.*;// sau pentru o singura clasa:// import ro.unitbv.vega.cutie;

Declararea şi folosirea pachetelor

Page 27: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

27

● pachetul java.lang este importat implicit (de exemplu, aici se află declarat obiectul System)

● tipuri de acces➔ acces public (clasă şi pachet)➔ acces private (doar în clasă)➔ acces package (pachet) – nu se specifică nimic înainte de

cuvântul cheie class; clasa nu mai este vizibilă în exterior, ci numai claselor din interiorul pachetului

➔ acces protected (folosit pentru extinderea obiectelor – moştenire)

Pachete şi reglementarea accesului

Page 28: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

28

Variabile şi alocarea lor

public class AssignmentReview {public static void main (String[] args) {

Integer num;num = new Integer (3);Integer x = num;Integer y = new Integer (3);Integer z;

}}

Page 29: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

29

Java heap

Heap-ul este o zonă de date unde se stochează referinţele şi obiectele în timpul rulării

num x y z

Integer:3

Integer:3 null

Page 30: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

30

Referinţe null● Referinţele neiniţializate sunt 0 (null, adică

referire spre adresa 0)● Se foloseşte operatorul '=' pentru a asigna un

obiect unei referinţe● null nu este un obiect (nu are metode şi nici

variabile membre)● Unele metode pot modifica obiectul● Un singur obiect poate avea mai multe referinţe,

atenţie la efectele colaterale ● z.intValue () generează o eroare

(mai exact, NullPointerException)

Page 31: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

31

Tipuri referinţă

● Cunoscute sub denumirea de Objects● O instanţă a unui obiect se creează folosind new● Cuvântul cheie new:

1.Alocă spaţiu de memorie pentru obiect2.Cheamă constructorul specificat după new3.Întoarce o referinţă la noul obiect creat

Page 32: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

32

Static vs. ne-static

● Variabilele membre şi metodele pot fi declarate “static”

● Membrii statici aparţin de clasă

● O variabilă membru statică este comună pentru toate instanţele clasei (toate obiectele de acel tip)

● Membrii ne-statici aparţin instanţelor clasei

Page 33: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

33

Variabile membre ne-staticepublic class Bean {

public int beanCounter = 0;public Bean () {

beanCounter ++;}

public static void main (String[] args) {new Bean (); new Bean ();Bean bean = new Bean ();System.out.println (bean.beanCounter);// afişează 1

}}

Page 34: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

34

Variabile membre staticepublic class Bean {

public static int beanCounter = 0;public Bean () {

beanCounter ++;}

public static void main (String[] args) {new Bean (); new Bean ();new Bean ();System.out.println (Bean.beanCounter);// afişează 3

}}

Page 35: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

35

Metode ne-statice

public class Bean {private boolean planted = false;public void plantBean () {

planted = true;}

public static void main (String[] args) {Bean bean = new Bean ();bean.plantBean (); // invocată la instanţă

}}

Page 36: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

36

Metode statice

public class Bean {private boolean planted = false;public static void plantBean (Bean bean) {

bean.planted = true;}

public static void main (String[] args) {Bean bean = new Bean ();Bean.plantBean (bean); // invocată la clasă// “bean.plantBean (bean);” e permis dar nerecomandat!

}}

Page 37: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

37

Referinţe

● Toate obiectele trimise ca parametri către o metodă sunt trimise ca referinţe!

● Referinţele au un domeniu de existenţă (scope)● Domeniul se defineşte cu acoladele { şi }● Referinţele există de la declararea lor şi până la

terminarea domeniului (acoladă închisă)● Variabilele membre pot fi referite în toată clasa● Parametrii pot fi referiţi în toată metoda

Page 38: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

38

Exemplu de domenii

public class ScopeExample {private int globalField;

public int method (int parameter) {int localVar1;if (globalField > 0) {

int x;}int localVar2;

}}

Page 39: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

39

Un alt exemplu de domenii

public class ScopeExample {private int globalField;

public int method (int parameter) {int globalField; // posibil, dar se pierde vizibilitatea!int localVar;if (this.globalField > 0) { // accesarea variabilei membre

int x;}int localVar; // declaraţie ilegală: acelaşi domeniu!

}}

Page 40: Structuri de Date în JAVA (II)vega.unitbv.ro/~galmeanu/java/suport/curs-2/doc/java-curs-2.pdfStructuri de Date în JAVA (II) Programarea orientată obiect în Java Clasă. Variabile

40

Precizia floating pointSystem.out.println (1.00 - .42);

// 0.6100000000000000001System.out.println (1.00 – 9 * .10);

// 0.0999999999999999995

● BigDecimal● De tip Object

● int sau longSe ţine cont de zecimale, de exemplu o sumă de o stocăm la

nivel de bani (nu direct lei)● Constante Double

● Double.POSITIVE_INFINITY● Double.NEGATIVE_INFINITY● Double.NaN (împărţire cu 0)