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静态方法去比较。