Java——Object
一、概念
Object是类层结构的根,每个类都把Object作为超类。所有对象(包括数组)都实现了这个类的方法。
二、toString
2.1、源码
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
2.2、介绍
toString方法的功能是将对象转换为字符串的形式,执行时机是每次打印对象,或者与字符串进行拼接,都会默认调用toString方法。
2.3、代码示例
public class Test {
public static void main(String[] args) {
Student stu = new Student();
System.out.println(stu); // com.itheima.obj.Student@1540e19d
}
}
Student类型继承了Object没有对toString方法重写,因此这个结果就是由Object的toString方法所定义的。
2.4、重写toString
我们如果对打印的内容不满意,可以去重写方法,也可以借助IDEA的快捷键生成:先按Alt + Insert,然后再选择toString()选项,选择需要打印的属性结果就可以了。
// Student.java
public class Student {
private String name;
private int age;
// 空参、有参构造方法
// get、set...
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
// Test.java
public class Test {
public static void main(String[] args) {
Student stu = new Student("张三", 27);
System.out.println(stu); // Student{name='张三', age=27}
}
}
这样打印的结果内容就不一样了,比较直观。
三、equals
3.1、源码
public boolean equals(Object obj) {
return (this == obj);
}
3.2、介绍
equals方法的功能是比较两个对象是否相同。源码中可以看出默认是比较两个对象的地址。this指的是调用equals方法的对象,obj是方法传入的对象。
3.3、代码示例
// Phone.java
public class Phone {
private String brand;
private int price;
// 空参、有参、get、set、toString
}
// Test.java
public class Test {
public static void main(String[] args) {
Phone p1 = new Phone("苹果", 5999);
Phone p2 = new Phone("苹果", 5999);
System.out.println(p1 == p2); // false
System.out.println(p1.equals(p2)); // false
}
}
因为p1和p2两次创建的不同对象,地址不同。equals内部就是比较对象地址的,因此返回false。
3.4、重写equals
上述例子我们期望的值是true,因为这两个对象的类型相同,而且属性值内容相同,我们认为两个对象是相等的。就可以重写该方法。
我们可以自己去重写方法,也可以借助IDEA的快捷键生成:先按Alt + Insert,然后再选择equals() and hashCode()选项,选择需要比较的属性结果就可以了。
// Phone.java
public class Phone {
private String brand;
private int price;
// 空参、有参、get、set、toString
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Phone phone = (Phone) o;
return price == phone.price &&
Objects.equals(brand, phone.brand);
}
@Override
public int hashCode() {
return Objects.hash(brand, price);
}
}
// Test.java
public class Test {
public static void main(String[] args) {
Phone p1 = new Phone("苹果", 5999);
Phone p2 = new Phone("苹果", 5999);
System.out.println(p1 == p2); // false
System.out.println(p1.equals(p2)); // true
}
}
这样打印的就是true了。
四、Objects工具类
4.1、介绍
Objects是JDK1.7新增的一个对象工具类,里面都是静态方法可以用来操作对象。比如对象的比较,计算对象的hash值,判断对象是否为空...
比如里面的equals方法,可以避免空指针异常。
public static boolean equals(Object a, Object b); // 判断两个对象是否相等
以下为比较
public static boolean equals(Object a, Object b){
return (a == b) || (a != null && a.equals(b));
}
a.equals(b); // 如果a为null值,肯定会空指针异常
Objects.equals(a, b); // 如果a为null值,不会空指针异常
以后如果要比较两个对象是否相同,可以借助Objects的equals静态方法去比较。

浙公网安备 33010602011771号