structuri de date în java...

Post on 26-Dec-2019

28 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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ţă

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

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 ();

}}

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> ...

}

5

Variabilă membră

● Descrie starea obiectului

class Human {int age;

}

<tipul clasei> <numele variabilei>;

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>;

7

22

● De ce nu a trebuit să scriem

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

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

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

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ă

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 ();

}}

12

Metode

● Procesează starea obiectului

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

}

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

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

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)

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

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

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 { ... }

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

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.

20

Bucla while

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

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

}

while (<predicat>) {...

}

21

Combinarea predicatelor

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

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

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

23

Câte tipuri avem ?

● Primitive● int a = 3 + 5;

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

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

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

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

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

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;

}}

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

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)

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

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

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

}}

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

}}

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ţă

}}

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!

}}

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

38

Exemplu de domenii

public class ScopeExample {private int globalField;

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

int x;}int localVar2;

}}

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!

}}

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)

top related