structuri de date în java...
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)