Class Object

Intro

  • Class Object is the root of the class hierarchy.

  • Every class has Object as a superclass.

Class Object

Constructor

/**
* Constructs a new object.
*/
@HotSpotIntrinsicCandidate
public Object() {}

Methods

Methods

  • toString(): String

  • equals(Object): boolean

  • hashCode(): int

  • getClass(): Class<?>

  • finalize(): void

  • clone(): Object

Methods for multithreading

  • notify(): void

  • notifyAll(): void

  • wait(): void

  • wait(long): void

  • wait(long, int): void

Model Person

public class Person {
    private final String firstname;
    private final String lastname;

    public Person(String firstname, String lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }
}

toString(): String

toString(): String

public String toString() {
    return getClass().getName()
            + "@"
            + Integer.toHexString(hashCode());
}

toString(): String

public class Example1ToString {
    public static void main(String[] args) {
        Person rakovets = new Person("Dmitry", "Rakovets");
        System.out.println(rakovets.toString());
    }
}
Person@db6cce66

toString(): String

public class Person {
    // ...

    @Override
    public String toString() {
        return firstname + ' ' + lastname;
    }
}

toString(): String

public class Example1ToString {
    public static void main(String[] args) {
        Person rakovets = new Person("Dmitry", "Rakovets");
        System.out.println(rakovets.toString());
    }
}
Dmitry Rakovets

equals(Object): boolean

equals(Object): boolean

public class Example2Equals {
    public static void main(String[] args) {
        Person rakovets = new Person("Dmitry", "Rakovets");
        Person anonymous = new Person("Dmitry", "Rakovets");
        System.out.println(rakovets.toString());
        System.out.println(anonymous.toString());
        System.out.println(anonymous.equals(rakovets));
    }
}
Dmitry Rakovets
Dmitry Rakovets
false

equals(Object): boolean

public class Person {
    // ...

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (firstname != null ? !firstname.equals(person.firstname) : person.firstname != null) return false;
        return lastname != null ? lastname.equals(person.lastname) : person.lastname == null;
    }
}

equals(Object): boolean

public class Example2Equals {
    public static void main(String[] args) {
        Person rakovets = new Person("Dmitry", "Rakovets");
        Person anonymous = new Person("Dmitry", "Rakovets");
        System.out.println(rakovets.toString());
        System.out.println(anonymous.toString());
        System.out.println(anonymous.equals(rakovets));
    }
}
Dmitry Rakovets
Dmitry Rakovets
true

hashCode(): int

hashCode(): int

public class Example3HashCode {
    public static void main(String[] args) {
        Person rakovets = new Person("Dmitry", "Rakovets");
        Person anonymous = new Person("Dmitry", "Rakovets");
        System.out.println(rakovets.toString());
        System.out.println(anonymous.toString());
        System.out.println(rakovets.hashCode());
        System.out.println(anonymous.hashCode());
    }
}

hashCode(): int

Dmitry Rakovets
Dmitry Rakovets
1523554304
1175962212

hashCode(): int

public class Person {
    // ...

    @Override
    public int hashCode() {
        int result = firstname != null ? firstname.hashCode() : 0;
        result = 31 * result + (lastname != null ? lastname.hashCode() : 0);
        return result;
    }
}

hashCode(): int

public class Example3HashCode {
    public static void main(String[] args) {
        Person rakovets = new Person("Dmitry", "Rakovets");
        Person anonymous = new Person("Dmitry", "Rakovets");
        System.out.println(rakovets.toString());
        System.out.println(anonymous.toString());
        System.out.println(rakovets.hashCode());
        System.out.println(anonymous.hashCode());
    }
}

hashCode(): int

Dmitry Rakovets
Dmitry Rakovets
-613626266
-613626266

Objects Equality

Objects Equality

  • Одинаковые объекты — это объекты одного класса с одинаковым содержимым полей.

  • Для одного и того-же объекта, хеш-код всегда будет одинаковым

Hash Code

Objects Equality

  • Если объекты одинаковые, то и хеш-коды будут одинаковые, но не наоборот.

Hash Code

Objects Equality

  • Если хеш-коды равны, то входные объекты не всегда равны (коллизия).

Hash Code

Objects Equality

  • Если хеш-коды разные, то и объекты гарантированно будут разные.

Hash Code

getClass(): Class<?>

getClass(): Class<?>

@HotSpotIntrinsicCandidate
public final native Class<?> getClass();

getClass(): Class<?>

public class Example2GetClass {
    public static void main(String[] args) {
        String string = "This is String";
        Class stringClass = string.getClass();
        System.out.println(stringClass.getName());

        Person person = new Person("Dmitry", "Rakovets");
        Class personClass = person.getClass();
        System.out.println(personClass.getName());
    }
}

getClass(): Class<?>

java.lang.String
Person

finalize(): void

finalize(): void

protected void finalize() throws Throwable {

finalize(): void

public class Person {
    // ...

    @Override
    protected void finalize() { // @Deprecated(since="9")
        System.out.println(this.toString());
        System.out.println("Call method: finalize()");
    }
}

finalize(): void

public class Example5Finalize {
    public static void main(String[] args) throws InterruptedException {
        Person person1 = new Person("Dmitry", "Rakovets");
        Person person2 = new Person("James", "Gosling");

        // After
        person1 = null;
        person2 = null;

        // Call GC: way 1
        System.gc();
        // Call GC: way 2
        Runtime.getRuntime().gc();
        // Increases the chance of garbage collection
        Thread.sleep(5_000);

        System.out.println("End program");
    }
}

finalize(): void

Dmitry Rakovets
Call method: finalize()
James Gosling
Call method: finalize()
End program

finalize(): void

  • finalize() запускается Garbage Collector.

  • Garbage Collector начинает работы при GC.

  • GC запускается JVM.

  • JVM сама решит когда нужно запускать GC.

End program

clone(): Object

How clone objects?

  • Переопределить protected метода класса Object: clone(): Object.

  • Реализовать Marker Interface (интерфейс-маркер): Cloneable.

public interface Cloneable {
}

clone(): Object

public class Person implements Cloneable {
    // ...

    @Override
    public Person clone() throws CloneNotSupportedException {
        super.clone();
        return new Person(this.firstname, this.lastname);
    }
}

clone(): Object

public class Example6Clone {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person rakovets = new Person("Dmitry", "Rakovets");
        Object clone = rakovets.clone();
        System.out.println(clone.toString());
        System.out.println(clone.equals(rakovets));
    }
}
Dmitry Rakovets
true