概述
java.langObject 类是Java语言中的根类,即所有类的父类。它中描述的所有方法(包括数组和自定义类)子类都可以使用。。在对象实例化的时候,最终找的父类就是Object。如果一个类没有特别指定父类, 那么默认则继承自Object类。例如:
public class MyClass /*extends Object*/ { // ... }
常用方法
根据JDK源代码及Object类的API文档,Object类当中包含的方法有11个
- public String toString() :返回该对象的字符串表示。
toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
代码举例
定义Person类
package demo01; public class Person { //定义成员变量 private String name; private int age; // 定义全参/无参构造方法 public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } //定义get/set方法 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; } }
定义测试类
package demo01; public class PersonTest { public static void main(String[] args) { Person person = new Person("张三", 18); // Person类默认继承了Object类,所以可以使用Object类中的toString方法 System.out.println(person.toString()); //直接打印对象的名字,其实就是调用对象的toString person=person.toString(); //看一个类是否重写了toString,直接打印这个类的对象即可,如果没有重写toString方法那么打印的是对象的地址值 System.out.println(person); } }
代码执行后的结果
重写Person类的toString方法
package demo01; public class Person { //定义成员变量 private String name; private int age; //重写toString方法 @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } // 定义全参/无参构造方法 public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } //定义get/set方法 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; } }
再次执行测试类,结果如下:
tips:
在IntelliJ IDEA中,可以点击 Code 菜单中的 Generate...,也可以使用快捷键 alt+insert ,点击 toString() 选项。选择需要包含的成员变量并确定。如下图所示:
- public boolean equals(Object obj) :指示其他某个对象是否与此对象“相等”
调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。
- 默认地址比较:如果没有覆盖重写equals方法,那么Object类中默认进行==运算符的对象地址比较,只要不是同一个对象,结果必然为false。
public boolean equals(Object obj) { /* 详解: 方法参数:Object obj:可以接受传递任意的对象 this是谁?那个对象调用的方法,方法中的this就是那个对象;obj是谁?传递过来的参数是谁obj就是谁 == 比较运算符,返回一个boolean值 如果是基本数据类型:则==运算符比较的是值 如果是引用数据类型==运算符比较的是两个对象的地址值 */ return (this == obj); }
- 对象内容比较:如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方法。
package demo01; import java.util.Objects; public class Person { //定义成员变量 private String name; private int age; public boolean equals(Object o) { // 如果对象地址一样,则认为相同 if (this == o) return true; // 如果参数为空,或者类型信息不一样,则认为不同 if (o == null || getClass() != o.getClass()) return false; // 转换为当前类型 Person person = (Person) o; // 要求基本类型相等,并且将引用类型交给java.util.Objects类的equals静态方法取用结果 return age == person.age && Objects.equals(name, person.name); } }
这段代码充分考虑了对象为空、类型一致等问题,但方法内容并不唯一。大多数IDE都可以自动生成equals方法的代码内容。在IntelliJ IDEA中,可以使用 Code 菜单中的 Generate…选项,也可以使用快捷键 alt+insert ,并选择 equals() and hashCode() 进行自动代码生成。如下图所示: