什么是Object类
Object是所有类的父类,在java.lang包
Object类常用方法
- clone() 创建并返回此对象的副本,与引用传递不同。
- equals() 指示其他某个对象是否与此对象 “相等”
- finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的回收器调用此方法。
- getclass() 返回此Object运行时的类
- hashCode() 返回该对象的哈希码值
- notify() 唤醒此对象监视器上等待的单个线程
- notifyAll() 唤醒此对象监视器上等待的所有线程
- toString() 返回该对象的字符串表示
- wait() 等待
- wait(long timeout)
- wait(long timeout, int nanos)
== 和 equals对比
- == 是比较运算符,既然比较基本类型,也可以比较引用类型。
比较基本类型时比较值,比较引用类型时比较地址。 - equals 是Object类的方法,只能用于比较引用类型,不能比较基本数据类型
Object类中的equals源码:
举例public boolean (Object obj){ return (this == obj); }
public class Compare { public static void main(String[] args) { String s1= new String("a"); String s2= new String("a"); String s3="a"; String s4="a"; System.out.println(s1==s2); System.out.println(s3==s4); System.out.println(s1.equals(s2)); } } //false //true //true
重写equals()方法
重写前由于调用的是父类的Object类的equals()方法,仅作一次地址比较,两个对象的地址不同,因此输出false
public class OverrideEqualsMethod {
public int a;
public String b;
public OverrideEqualsMethod(int a, String b) {
this.a = a;
this.b = b;
}
public static void main(String[] args) {
OverrideEqualsMethod overrideEqualsMethod = new OverrideEqualsMethod(1,"str");
OverrideEqualsMethod overrideEqualsMethod2 = new OverrideEqualsMethod(1,"str");
System.out.println(overrideEqualsMethod.equals(overrideEqualsMethod2));
}
}
//false
重写后,输出true
import java.util.Objects;
public class OverrideEqualsMethod {
public int a;
public String b;
public OverrideEqualsMethod(int a, String b) {
this.a = a;
this.b = b;
}
public static void main(String[] args) {
OverrideEqualsMethod overrideEqualsMethod = new OverrideEqualsMethod(1,"str");
OverrideEqualsMethod overrideEqualsMethod2 = new OverrideEqualsMethod(1,"str");
System.out.println(overrideEqualsMethod.equals(overrideEqualsMethod2));
}
@Override
public boolean equals(Object o) {
// ==比较地址,如果是对象自己,立刻返回true
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
//向下转型
OverrideEqualsMethod that = (OverrideEqualsMethod) o;
return a == that.a && Objects.equals(b, that.b);
}
}
//true
hashCOde()
toString()
返回该对象的字符串表示
默认返回 全类名 + “@” + hashCode()的十六进制
Object类的toString()源码
public String toString(){
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
重写toString()
未重写
public class OverrideToStringMethod {
public int a;
public String b;
public static void main(String[] args) {
OverrideToStringMethod overrideToStringMethod = new OverrideToStringMethod(1,"str");
System.out.println(overrideToStringMethod);
}
public OverrideToStringMethod(int a, String b) {
this.a = a;
this.b = b;
}
}
//com.hello.out.OverrideToStringMethod@36d64342
重写后
public class OverrideToStringMethod {
public int a;
public String b;
public static void main(String[] args) {
OverrideToStringMethod overrideToStringMethod = new OverrideToStringMethod(1,"str");
System.out.println(overrideToStringMethod);
}
public OverrideToStringMethod(int a, String b) {
this.a = a;
this.b = b;
}
@Override
public String toString() {
return "OverrideToStringMethod{" +
"a=" + a +
", b='" + b + '\'' +
'}';
}
}
//OverrideToStringMethod{a=1, b='str'}
finalize()
类似于析构函数,在对象被销毁前自动被调用。
Java9之后不推荐使用finalize()了,实际开发中基本不会使用。
重写finalize()
public class OverrideFinalizeMethod {
int n;
public static void main(String[] args) {
OverrideFinalizeMethod overrideFinalizeMethod = new OverrideFinalizeMethod(10);
// 此时 new出来的对象会被回收,回收前会调用finalize方法
overrideFinalizeMethod = null;
// 主动运行垃圾回收期
System.gc();
}
public OverrideFinalizeMethod(int n) {
this.n = n;
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("override finalize() is called.");
}
}
//override finalize() is called.