Clasa Object
Clasa Object este clasa de baza mostenita in mod implicit de catre orice clasa in Java. Toate obiectele (inclusiv array) implementeaza metodele acestei clase.
Documentatia API a acestei clase poate fi gasita aici: http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html
Dupa cum se observa clasa Object defineste urmatoarele metode:
protected Object clone()
boolean equals(Object obj)
protected void finalize()
Class<?> getClass()
int hashCode()
void notify()
void notifyAll()
String toString()
void wait()
void wait(long timeout)
void wait(long timeout, int nanos)
In aceasta sectiune vor fi prezentate pe scurt metodele mostenite din clasa Object si modul in care programatorul le poate utiliza.
Metoda clone()
Metoda clone() se utilizeaza pentru a creea o copie exacta a unui obiect. Se recomanda evitarea folositii acestei metode in procesul de dezvoltare a aplicatiilor.
Metoda equals()
Metoda equals() este folosita pentru compararea obiectelor intre ele. In mod implicit metoda equals compara referintele. Astfel va returna true daca si numai daca cele doua obiecte comparate refera catre acelasi obiect in memorie.
Singura exceptie de la aceasta regula este clasa String pentru care metoda equals este suprascrisa si compara caracterele din obiectul de tip String.
public class Person { private long cnp; private String name; Person(String name, long cnp){ this.name = name; this.cnp = cnp; } @Override public boolean equals(Object obj) { if(obj instanceof Person){ Person p = (Person)obj; return cnp == p.cnp; } return false; } public static void main(String[] args) { Person p1 = new Person("Alin",12345); Person p2 = new Person("Dan",12345); if(p1.equals(p2)) System.out.println(p1+" and "+p2+ " are equals"); else System.out.println(p1+" and "+p2+ " are NOT equals"); if(p1==p2) //GRESIT ! System.out.println(p1+" and "+p2+ " are equals"); else System.out.println(p1+" and "+p2+ " are NOT equals"); //Comparare stringuri if(p1.name.equals(p2.name)) System.out.println(p1+" and "+p2+" have the same names"); else System.out.println(p1+" and "+p2+" have different names"); } }
In exemplul de mai sus este exemplificat modul in care metoda equals poate fi suprascrisa pentru a compara doua obiecte de tip Person. Este la latitudinea programatorul decizia cu privire la conditiile in care doua obiecte sunt egale. In cazul de fata obiectele de tip person sunt egale daca atributul cnp corespunde la cele doua obiecte comparate.
Metoda hashCode()
Pentru functionarea corecta a colectiilor (clase speciale ce ofera mecanisme pentru stocarea obiectelor) este nevoie ca obiectele ce suprascriu metoda equals() si sunt adaugate in cadrul colectiilor sa suprascrie de asemenea si metoda hashCode(). Aceasta trebuie sa returneze un numar intreg pozitiv care sa fie consistent cu valoarea de adevar returnata de metoda equals(). Aceasta inseamna ca daca doua obiecte sunt egale atunci si valorile hashCode returnate de cele doua functii trebuie sa fie egale.
public class Employee { int id; int salary; String name; Employee(String name, int id, int salary ){ this.id = id; this.name = name; this.salary = salary; } public boolean equals(Object o){ if(o==null||!(o instanceof Employee) ) return false; Employee x = (Employee)o; return x.id==id&&x.name.equals(name)&&x.salary==salary; } public int hashCode(){ return id + name.hashCode()+salary; } public String toString(){ return id+":"+name; } }
Metoda finalize()
Methoda finalize() este apelata in momentul in care un obiect urmeaza sa fie sters din memorie. Acest lucru se intampla cand obiectul ramane fara nici un referinta catre ele. Componenta care sa ocupa cu stergerea obiectelor din memorie este Garbage Collector. Detalii cu privire la functionarea GC pot fi gasite aici: garbagecollector
Metoda getClass()
Metoda getClass() nu poate fi suprascrisa. Aceasta returneaza un obiect de tip Class. Class este o clasa din pachetul java.lang ce este folosita in “bucataria interna” a masinii virtuale Java. Pentru orice clasa folosita in cadrul unui program, JVM construieste un obiect de tip Class corespunzator acelei clase.
Metoda getClass returneaza obiectul de tip Class corespunzator clasei din care a fost construit obiectul pentru care este apelata.
Clasa Class are peste 50 de metode si ofera informatii detaliate cu privire clasa din care a fost construit obiectul.
In mod uzual pentru un program obisnuit nu este necesara utilizarea clasei Class.
import java.lang.reflect.Method; public class Point { private int x; private int y; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public String toString(){ return "Point["+x+","+y+"]"; } public static void main(String[] args) { Point p = new Point(); Class co = p.getClass(); System.out.println("Class name for object "+p+" is +"+co.getSimpleName()); System.out.println("List of methods for class "+co.getSimpleName()+":"); Method[] ms = co.getDeclaredMethods(); for(Method m:ms) System.out.println(m.getName()); } }
Rezultatul rularii programului de mai sus este:
Class name for object Point[0,0] is +Point List of methods for class Point main toString getX setX getY setY
Metoda toString()
Metoda toString() returneaza reprezentarea ca sir de caractere (text) a unui obiect.
In mod implicit metoda toString returneaza numele clasei, urmat de caracterul '@' si apoi de adresa de memorie unde stocat obiectul.
Metoda toString() este apelata in mod automat in momentul in care se incearca afisarea unui obiect.
public class Point { private int x; private int y; public static void main(String[] args) { Point p = new Point(); Point p2 = new Point(); System.out.println("p="+p); System.out.println("p2="+p2); p2 = p; System.out.println("p2="+p2); Point p3=null; System.out.println("p3="+p3); } }
Rezultatul rularii programului de mai sus este:
p=Point@2792e317 p2=Point@1c7b0f4d p2=Point@2792e317 p3=null
Se observa de exemplu ca la a doua afisare a obiectului p2 se afiseaza aceiasi valoare ca si pentru obiectul p. Aceasta deoarece operatia de atribuire in cazul obiectelor are ca efect copierea adresi la care refera (pointeaza) obiectul. Cu alte cuvinte atat p2 cat si p vor pointa catre acelasi obiect in memorie.
Utilizarea metodei toString() este utila in special in procesul de depanare al obiectelor. Aceasta poate fi suprascrisa pentru a afisa starea obiectului la momentulafisarii obiectului.
public class Point { private int x; private int y; public String toString(){ return "Point["+x+","+y+"]"; } public static void main(String[] args) { Point p = new Point(); Point p2 = new Point(); System.out.println("p="+p); System.out.println("p2="+p2); p2 = p; System.out.println("p2="+p2); } }
Rezultatul rularii programului de mai sus este:
p=Point[0,0] p2=Point[0,0] p2=Point[0,0] p3=null
Metodele wait si notify
Metodele wait() si notify() sunt utilizae in procesul de sincronizare a firelor de executie. Detalii cu privire la aceste metode sunt prezentate in sectiunea ce descrie utilizarea firelor de executie (Thread) in cadrul programelor.