220 likes | 525 Views
Java – Clase si obiecte. Clase descriere tipuri import si pachete metode constructori Obiecte creare utilizare. Clase. se declara folosind cuvantul cheie class ; corpul clasei se scrie intre acolade { … }; dupa ce clasa a fost definita, se pot crea obiecte pe baza ei;
E N D
Java – Clase si obiecte Clase descriere tipuri import si pachete metode constructori Obiecte creare utilizare
Clase • se declara folosind cuvantul cheie class; • corpul clasei se scrie intre acolade { … }; • dupa ce clasa a fost definita, se pot crea obiecte pe baza ei; • obiectul reprezinta o instantiere a clasei • clasa poate sa contina: • variabile • metode • initialiari • alte clase • variabilele si metodele clasei pot fi: • de instanta: fiecare obiect are propriile instante; variabilele de instanta definesc starea obiectului; • statice: comune clasei si tututor instantelor.
Clase - continuare • metoda main() este punctul de intrare intr-o aplicatie Java; trebuie sa fie publica pentru a putea fi apelata de Masina Virtuala Java (MVJ); este statica si nu necesita crearea unei instante de clasa; • persistenta variabileleor din clase sau metode poate fi: • membru: creata si la crearea instantei si distrusa la distrugerea obiectului • automata (locale in metoda): create la intrarea in metoda (prin apel) si pastrata atat timp cat metoda se ruleaza; • clasa (sau statica): creata la incarcarea clasei de MVJ si distrusa la descarcarea clasei. • modificatorii de acces la clasa se scriu inainte de declaratia de clasa (public, protected si private) si controleaza vizibilitatea clasei.
Tipuri de clase • clasa se pot declara ca si subclasa unei alte clase prin folosirea cuvantului cheie extends; • prin subclasare se formeaza ierarhii de clase; cel mai inalt nivel in ierarhie se numeste superclasa sau clasa de baza; subclasa mosteneste toate variabilele si metodele (ce nu sunt private) superclasei pe care o extinde; o clasa poate extinde sau mosteni o singura superclasa; subclasa adauga superclasei noi variabile si metode; • clasele de baza din Java sunt din urmatoarele categorii: • publice: clase care sunt vizibile pentru alte clase indiferent de pachet; toate clasele sunt extensia clasei Object in Java; • abstracte: o clasa ce este implementata incomplet (are metode abstracte); din acest motiv nu poate fi instantiata si trebuie extinsa de subclase • finale: o clasa care nu poate avea subclase.
Import si pachet • codul Java este organizat in pachete; numele de pachete sunt utilzate de MVJ pentru identificarea si controlul accesului la obiecte; • pachetul contine diferite tipuri de clase; numele publice dintr-un pachet trebuie sa fie unice; • pachetele sunt organizate ierarhic si stocate utilizand directori si fisiere; in cod, numele unei clase trebuie scris complet sub forma numepachet.numesubpachet; • importul defineste procesul de aducere intr-un spatiu intern a ceva din cel extern; procedura de import permire ca in locul numelui complet, in cod, sa se foloseasca doar numesubpachet; • codul poate sa nu aiba un nume de pachet, insa atunci nu poate contine subpachete si va fi stocat intr-un singur director, dar in fisirere distincte (fiecare clasa e un fisier); • bibliotecile de clase standard (java.lang, java.util, java.io, java.net, java.awt, java.swing) Java se pot folosi de programator prin import.
Metode -definitie vizibilitate tip nume_met([lista parametri]) { corp_1 } • metoda implementeaza o operatie cu datele obiectului • se implementeaza sub forma unor proceduri sau functii (acestea întorc valori cu return) ce realizeaz anumite operatii • se definesc numai într-o declaratie de clasa; tip - defineşte tipul de date întors de metoda; nume_met - defineşte numele metodei ;[lista parametri] - o secventa opionala de perechi tip nume separate prin virgule; • vizibilitatea defineste cine anume poate apela metoda; pentru public acesta este apelabila in toata aplicatia, pentru private numai de alte metode din clasa în care s-a definit. • daca metoda întoarce valoare (este functie), ea va avea specificat unul dintre tipurile deja discutate şi o instruciune de salt neconditionat return expresie ca va genera întoarcerea în codul apelant cu valoarea lui expresie. • daca metoda nu întoarce valoare (este procedura), tipul ei este obligatoriu void şi nu contine instructiuneareturn.
Metode -apel refObiect.nume_met(argumente) • sintaxa generala pentru apelul unei metode este data mai sus; • aplelul este o instructiune de salt ce are ca efect rularea codului din corpul metodei; • parametrii din definitia de metoda sunt variabile ce primesc valori în momentul apelului şi se numesc argumente; • valorile parametrilor ce sunt tipuri de date primitive se transfera printr-o metoda numita transfer prin valoare; • la transferul prin valoare, metodei, i se transfer o copie a valorilor parametrilor din programul apelant; ca urmare modificarea lor in metoda nu afecteaza valorile originale; • in cazul parametrilor de tipul referinta la obiect se poate modifica starea obiectului utilizând metodele puse la dispozitie în acest scop, dar nu se pot modifica referintele argumentelor de tipul referinta la obiect în corpul metodei.
Constructor public nume_clasa() { ... }; • defineşte starea initiala a obiectelor; • are acelaşi nume cu clasa; • este apelat automat dupa crearea obiectului, înainte ca operatorul new sa se termine; • nu întorc o valoarea de un anumit tip (nu se scrie nici macar void); • sintactic sunt identice cu metodele (pot avea parametri); este posibil sa nu aiba parametri; daca nu este scris explicit in cod, compilatorul creeaza automat unul implicit • constructorii nu se mostenesc, trebuie definiti pentru fiecare subclasa; un constructor poate apela un altul, dein aceeasi clasa, folosind sintaxa this(argumente); constructorii supercalsei se pot apela foloind sintaxa super(argumente) iar acest apel trebuie sa fie prima linie din constructor; • constructorii pot fi supraincarcati.
Obiecte - creare • obiectele se creeaza cu operatorul new • new realizeaza urmtoarele actiuni: • aloca memorie pentru nou obiect; • apeleaza o metoda speciala de initializare numita constructor; • întoarce o referinta la noul obiect (ce trebuie obligatoriu stocata intr-o variabila referinta la obiect sau, mai pe scurt, referinta, pentru a putea lucra cu obiectul pe mai departe). • variabila referinta la obiect se foloseste pentru a referi (accesa) obiectul; ea trebuie sa fie declarata de un anumit tip (clasa) ce nu se poate schimba dar poate referi orice subtip (subclasa) a tipului refObiect = new nume_clasa();
Exemplul – 1 / 1 Creati o aplicatie noua, apoi un proiect nou in JDeveloper. Creati clasa Punct ce contine majoritatea elementelor specifice unei clase simple. public class Punct { //Variabile de instanta private double x; private double y; private double distanta; //Constructori Punct() { setX(0); setY(0); distanta = 0; } Punct(double x, double y) { setX(x); setY(y); actualizareDistanta(); } // Metode public void setX(double x0) { x = x0; actualizareDistanta(); } public void setY(double y0) { y = y0; actualizareDistanta(); } public double x() { return x; } public double y() { return y; } public double distantaOrigine() { return distanta; } private void actualizareDistanta() { distanta = Math.sqrt(x*x+y*y); } public String toString() { return "<" + x + "," + y + ">"; } }
Exemplul - 1 /2 In proiectul ce contine clasa Punct creati o noua clasa cu numele Grafica si codul alaturat. Observati ca aceasta clasa are doar o metoda main() din care se foloseste pentru crearea de doua obiecte p1 si p2 pe baza clasei Punct. Rulati apliactia si explicati rezultatele afisate. public class Grafica { public static void main(String[] args){ Punct p1; Punct p2 = new Punct(-1.,7.); p1 = new Punct(); System.out.println("p1 = " + p1.toString()); System.out.println("p2 = " + p2.toString()); p1.setX(12); p2.setY(13.345); System.out.println("p1 = " + p1.toString()); System.out.println("p2 = " + p2.toString()); } }
Exemplul – 1/3 public class Grafica1 { public static void main(String[] args) { double x = 5; PunctOK p1 = new PunctOK(); PunctOK p2 = new PunctOK(-1.,7.); System.out.println("in afara lui dubleazaX x este: " + x); dubleazaX(x); System.out.println("in afara lui dubleazaX x este: " + x); System.out.println("p1 = " + p1); System.out.println("p2 = " + p2); interschimba(p1, p2); System.out.println("p1 = " + p1); System.out.println("p2 = " + p2); schimbaX(p1); System.out.println("p1 = " + p1); } //modificarea valorii argumentului //NU se reflecta in codul apelant public static void dubleazaX(double a) { a = 2. * a; System.out.println("in dubleazaX x este: " + a); } //metoda de interschimbare NU lucreaza //ca urmare a transferului prin valoare public static void interschimba(PunctOK x, PunctOK y){ PunctOK aux = x; x = y; y = aux; } //lucreaza corect public static void schimbaX(PunctOK x) { x.setX(100); } } In proiectul ce contine clasele Punct si Grafica creati o noua clasa cu numele Grafica1 si codul alaturat. Rulati noua clasa si explicati rezultatele afisate de aplicatie?
Aplicatia 1/1 f(x)=4sin(x)-x+1, x in [-3,3] Scrieti o aplicatie Java pentru gasirea solutiei unei ecuatii transcendente prin injumatatirea intervalului. public class InjumatatireV2 { private double a, b, x, eps; protected int max_iter; public double f(double x) { return 4. * Math.sin(x) - x + 1.; } public InjumatatireV2(double st, double dr, double prec) { a = st; b = dr; eps = prec; max_iter = 100; } public void solverInjumatatire() { int n = 0; while ((Math.abs(b - a) > eps) && (n++ < max_iter)) { x = (a + b) / 2.; if (f(x) == 0) { System.out.println("Radacina este: " + x); System.exit(0); }
Aplicatia 1/2 if (Math.signum(f(a)) * Math.signum(f(x)) > 0) a = x; else b = x; } if (Math.abs(b - a) > eps) System.out.println("Precizia nu e a fot atinsa in " + (n-1) + " iteratii"); else System.out.println("Radacina aprox. (cu Inj): " + x); } public static void main(String[] args) { InjumatatireV2 sol = new InjumatatireV2(-3.,3., 1.e-07); sol.solverInjumatatire(); } }
Aplicatia 2/1 Scrieti o aplicatie Java pentru gasirea solutiei unei ecuatii transcendente prin Newton-Raphson intervalului. public class NewtonRaphsonV1 { private double x, eps; private int max_iter, n; private double f(double x) { return 4. * Math.sin(x) - x + 1.; } private double fderivat(double x) { final double h = 0.001; return (f(x + h) - f(x)) / h; } public NewtonRaphsonV1(double x0, double prec, int iter) { x = x0; max_iter = iter; eps = prec; }
Aplicatia 2/2 public void solverNewtonRaphson() { double aux; do { aux = f(x) / fderivat(x); x -= aux; ++n; } while ((Math.abs(aux) > eps) && (n <= max_iter)); System.out.println("Radacina aprox. (cu N-R V1): " + x); if (Math.abs(aux) >= eps) { System.out.println("Precizia nu e a fot atinsa in " + n + " iteratii"); } } public static void main(String[] args) { NewtonRaphsonV1 sol = new NewtonRaphsonV1(-3.,1.e-07,100); sol.solverNewtonRaphson(); } }
Bibliografie • http://www.east.utcluj.ro/mb/mep/antal/downloads.html > Java: course, IDE (JDeveloper), JDK and JRE, JDeveloper labs. • http://docs.oracle.com/cd/E18941_01/tutorials/jdtut_11r2_50/jdtut_11r2_50.html > Getting Started With the JDeveloper IDE