前提:所以类都直接或间接继承Object类,所有类都能使用Object类里的public方法。
toString
细节:打印对象名时,println方法源码是调用toString方法,所有结果相同。
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
toString方法的getClass().getName() 是全类名(包名+类名)
Integer.toHexString() : 转16进制
hashCode() : 将内存地址通过hash算法得出整数的hash值
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public class toString {
public static void main(String[] args) {
A a = new A();
System.out.println(a);
System.out.println(a.toString());
}
}
可以在类中进行重写,使打印内存更有意义。
public class A {
String name;
int age;
@Override
public String toString() {
return "A{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
equals
equals方法默认是对象内存地址作比较。
public boolean equals(Object obj) {
return (this == obj);
}
对比内容需要重写类中equals方法。
先判断类是否相同,再比较内容,其中String的equals方法已经重写(比较内容)。
@Override
public boolean equals(Object obj) {
if (obj instanceof A){
A a = (A) obj;
return this.age == a.age && this.name.equals(a.name);
}else {
return false;
}
}
Objects.equals方法
Objects为Object的子类,它的equals判断逻辑是先看地址是否相同,相同则短路或返回true,不同看a对象是否为null,是则短路与返回false,这样就不会空指针异常。
调用是a对象类重写的equals方法。
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}