/**
* Constructs a new object.
*/
@HotSpotIntrinsicCandidate
public Object() {}ObjectClass Object is the root of the class hierarchy.
Every class has Object as a superclass.
Object/**
* Constructs a new object.
*/
@HotSpotIntrinsicCandidate
public Object() {}toString(): String
equals(Object): boolean
hashCode(): int
getClass(): Class<?>
finalize(): void
clone(): Object
notify(): void
notifyAll(): void
wait(): void
wait(long): void
wait(long, int): void
Personpublic class Person {
private final String firstname;
private final String lastname;
public Person(String firstname, String lastname) {
this.firstname = firstname;
this.lastname = lastname;
}
}toString(): StringtoString(): Stringpublic String toString() {
return getClass().getName()
+ "@"
+ Integer.toHexString(hashCode());
}toString(): Stringpublic class Example1ToString {
public static void main(String[] args) {
Person rakovets = new Person("Dmitry", "Rakovets");
System.out.println(rakovets.toString());
}
}Person@db6cce66
toString(): Stringpublic class Person {
// ...
@Override
public String toString() {
return firstname + ' ' + lastname;
}
}toString(): Stringpublic class Example1ToString {
public static void main(String[] args) {
Person rakovets = new Person("Dmitry", "Rakovets");
System.out.println(rakovets.toString());
}
}Dmitry Rakovets
equals(Object): booleanequals(Object): booleanpublic 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): booleanpublic 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): booleanpublic 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(): inthashCode(): intpublic 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(): intDmitry Rakovets Dmitry Rakovets 1523554304 1175962212
hashCode(): intpublic class Person {
// ...
@Override
public int hashCode() {
int result = firstname != null ? firstname.hashCode() : 0;
result = 31 * result + (lastname != null ? lastname.hashCode() : 0);
return result;
}
}hashCode(): intpublic 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(): intDmitry Rakovets Dmitry Rakovets -613626266 -613626266
Одинаковые объекты — это объекты одного класса с одинаковым содержимым полей.
Для одного и того-же объекта, хеш-код всегда будет одинаковым

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

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

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

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(): voidfinalize(): voidprotected void finalize() throws Throwable {finalize(): voidpublic class Person {
// ...
@Override
protected void finalize() { // @Deprecated(since="9")
System.out.println(this.toString());
System.out.println("Call method: finalize()");
}
}finalize(): voidpublic 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(): voidDmitry Rakovets Call method: finalize() James Gosling Call method: finalize() End program
finalize(): voidfinalize() запускается Garbage Collector.
Garbage Collector начинает работы при GC.
GC запускается JVM.
JVM сама решит когда нужно запускать GC.
End program
clone(): ObjectПереопределить protected метода класса Object: clone(): Object.
Реализовать Marker Interface (интерфейс-маркер): Cloneable.
public interface Cloneable {
}clone(): Objectpublic class Person implements Cloneable {
// ...
@Override
public Person clone() throws CloneNotSupportedException {
super.clone();
return new Person(this.firstname, this.lastname);
}
}clone(): Objectpublic 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