Object所属包:java.lang
Object在Java_API帮助文档中的描述:类 Object
是类层次结构的根类。每个类都使用 Object
作为超类。所有对象(包括数组)都实现这个类的方法。
本次讲述类Object的hashCode()方法,getClass()方法,toString()方法,equals()方法
首先创建一个JavaBean类Student,其中的属性包括姓名,年龄,性别,代码如下:
public class Student {
private String name;
private Integer age;
private String sex;
public Student() { // 空参构造
super();
}
public Student(String name, Integer age, String sex) { // 有参构造
super();
this.name = name;
this.age = age;
this.sex = sex;
}
/*
* 生成属性的get,set方法(使用快捷键-Alt+Shift+s 生成)
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
(类Object的hashCode()方法)
hashCode():返回该对象的哈希码值;返回值类型为int型。
import com.heima.bean.Student;
public class Demo1_Hashcode {
/*
* 不同对象的,hashCode()一般来说不会相同。但是,同一个对象的hashCode()值肯定相同。
*/
public static void main(String[] args) {
Object obj = new Object();
System.out.println(obj.hashCode());
Student stu1 = new Student("张三", 23, "男"); // Ctrl + Alt + 下建 向下复制一行
Student stu2 = new Student("李四", 24, "男");
System.out.println(stu1.hashCode());
System.out.println(stu2.hashCode());
}
}
我们会发现三个输出语句输出的结果都不相同。
(类Object的getClass()方法)
getClass():返回该对象正在运行的类;通过obj.getClass().getName()来获取当前正在运行的Java对象的类的名称,返回值为String类型的字符串。
public class Demo2_GetClass {
public static void main(String[] args) {
Student stu = new Student();
Class clazz = stu.getClass(); // 获取该对象的字节码文件
String name = clazz.getName(); // 获取类的名称
System.out.println(name);
}
}
(类Object的toString()方法)
toString():返回该对象的字符串表示,建议所有子类都重写此方法;返回值为String类型的字符串。
public class Demo3_ToString {
/* 没有重写toString()方法时输出
* com.heima.bean.Student@15db9742
* public String toString() {
* return getClass().getName() + "@" + Integer.toHexString(hashCode());
* }
* 左边:类名
* 中间:@
* 右边:hashCode的十六进制表现形式,返回值为String
* toString()方法一般重写,用来更方便的显示对象的属性值
* 而getXxxx()方法可以获取值,除可以显示属性值之外,还可以进行修改和其他操作
*/
public static void main(String[] args) {
Student stu = new Student("张三", 23, "男");
System.out.println(stu.toString());
System.out.println(stu); // 如果直接打印对象的引用,或默认调用toString()方法
System.out.println("姓名:" + stu.getName() + ",年龄:" + stu.getAge() + ",性别:" + stu.getSex());
}
}
toString()源码中的 Integer.toHexString(hashCode()) 我们通过查看API中的Integer可知:
toHexString(int i):以十六进制无符号整数形式返回一个整数参数的字符串表现形式。
在Student类中重写toString()方法:
// 使用快捷键生成toString()方法 - Alt+Shift+s
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
(类Object的equals()方法)
equals():用于比较两个对象是否相等,使用类Object中的equals()方法时,一般会重写equals()方法;返回值类型boolean型。
public class Demo4_Equals {
/*
* equals()方法,用于比较两个对象是否相等
* public boolean equals(Object obj) {
* return (this == obj);
* }
* 类Object中的equals()方法是比较对象的地址值,没有什么实际意义,
* 因为在开发过程中我们通常比较的是对象的属性值,我们认为相同的属性是同一对象,
* 因此我们一般要重写equals()方法
*/
public static void main(String[] args) {
Student stu1 = new Student("张三", 23, "男");
Student stu2 = new Student("张三", 23, "男");
boolean b = stu1.equals(stu2);
System.out.println(b);
System.out.println(stu1 == stu2); // 比较两个对象是否相等,其实equals()方法的底层原理使用的就是-(this == obj)
}
}
重写类Object中的equals()方法:
@Override
public boolean equals(Object obj) { // stu1.equals(stu2);
// (Object obj)与(stu2): 父类引用指向子类对象,所以父类无法反问子类所特有的属性和行为,需向下转型
Student stu = (Student) obj;
return this.name.equals(stu.name) && this.age == stu.age && this.sex.equals(stu.sex);
}