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.