Object概述
java.lang.Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。
如果一个类没有特别指定父类, 那么默认则继承自Object类。
常用方法
public String toString():返回该对象的字符串表示。
代码举例:
定义person类
package demo01; public class Person { //创建成员变量 private String name; private int age; //getXxx setXxx方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //直接打印对象名是输出对象的内存地址值,没有意义。我们要重写toString方法,输出我们想要的内容。 @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
定义测试类
package demo01; public class Demo01ToString { public static void main(String[] args) { //创建person对象 Person person = new Person(); /*java.lang.Object`类是Java语言中的根类,即所有类的父类。 `public String toString()`:返回该对象的字符串表示。 */ //直接打印 对象名 其实就是调用对象的ToString方法。默认输出的是内存地址值 System.out.println(person);// 等价于 System.out.println(person.toString()); } }
执行结果:
注意:
- 看一个类是否重写了toString方法,只需要直接打印对象名即可。如果输出结果是内存地址值,那么此类就没有重写toString方法。
- 在IntelliJ IDEA中,可以点击Code菜单中的Generate,也可以使用快捷键alt+insert,点击toString()选项。选择需要包含的成员变量并确定。
public boolean equals(Object obj):比较其他某个对象是否与此对象“相等”。参数:object obj :可以传递任意的对象。
查看equals源码:
public boolean equals(Object obj) { // 默认是使用== 运算符 去判断2个对象是否相等 return (this == obj); }
分析源码:
this是谁?
谁调用此方法,this就是哪个对象。谁是参数,obj就代表谁。例如:
Person p1 = new Person("张三", 18); Person p2 = new Person("李四", 19); boolean b = p1.equals(p2); // this就是p1,obj参数就是p2 , this == obj 等价于 p1 = p2 System.out.println(b);//false
又因为:
== 比较运算符,返回的是一个布尔值 true false。根据数据类型的不同,比较的内容不同。
- 基本数据类型:比较的是数值
- 引用数据类型:比较的是内存地址值
结论:
object 类中的equals方法,默认比较的是对象的内存地址值,没有意义。实际开发中我们需要重写equals方法比较对象的属性值。因为参数是object 是父类传递进来的是子类对象。多态弊端:无法使用子类特有的属性和方法,解决方法:向下转型。大多数IDE都可以自动生成equals方法的代码内容。在IntelliJ IDEA中,可以使用Code菜单中的Generate…选项,也可以使用快捷键alt+insert,并选择`equals() and hashCode()进行自动代码生成。生成的equals方法代码如下:
@Override public boolean equals(Object o) { // 如果内存地址,一样 那么必然相等, if (this == o) return true; /*getClass() != o.getClass()利用反射技术判断是p,是否是Person类型 等价于obj instanceof Person */ if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; //Objects.equals(name, person.name); 可以防止空指针异常,详解:Ojects类equals 源码 return age == person.age && Objects.equals(name, person.name); }
这段代码充分考虑了对象为空、类型一致等问题,但方法内容并不唯一。