4 Object类
4.1 概述
tips:重点讲解内容
查看API文档,我们可以看到API文档中关于Object类的定义如下:
Object类所在包是java.lang包。Object 是类层次结构的根,每个类都可以将 Object 作为超类。所有类都直接或者间接的继承自该类;换句话说,该类所具备的方法,其他所有类都继承了。
查看API文档我们可以看到,在Object类中提供了一个无参构造方法,如下所示:
但是一般情况下我们很少去主动的创建Object类的对象,调用其对应的方法。更多的是创建Object类的某个子类对象,然后通过子类对象调用Object类中的方法。
4.2 常见方法
tips:重点讲解内容
常见方法介绍
我们要学习的Object类中的常见方法如下所示:
public String toString() //返回该对象的字符串表示形式(可以看做是对象的内存地址值) public boolean equals(Object obj) //比较两个对象地址值是否相等;true表示相同,false表示不相同 protected Object clone() //对象克隆
案例演示
接下来我们就来通过一些案例演示一下这些方法的特点。
案例1:演示toString方法
实现步骤:
- 创建一个学生类,提供两个成员变量(name , age);并且提供对应的无参构造方法和有参构造方法以及get/set方法
- 创建一个测试类(ObjectDemo01),在测试类的main方法中去创建学生对象,然后调用该对象的toString方法获取该对象的字符串表现形式,并将结果进行输出
如下所示:
Student类
public class Student { private String name ; // 姓名 private String age ; // 年龄 // 无参构造方法和有参构造方法以及get和set方法略 ... }
ObjectDemo01测试类
public class ObjectDemo01 { public static void main(String[] args) { // 创建学生对象 Student s1 = new Student("itheima" , "14") ; // 调用toString方法获取s1对象的字符串表现形式 String result1 = s1.toString(); // 输出结果 System.out.println("s1对象的字符串表现形式为:" + result1); } }
运行程序进行测试,控制台输出结果如下所示:
s1对象的字符串表现形式为:com.itheima.api.system.demo04.Student@3f3afe78
为什么控制台输出的结果为:com.itheima.api.system.demo04.Student@3f3afe78; 此时我们可以查看一下Object类中toString方法的源码,如下所示:
public String toString() { // Object类中toString方法的源码定义 return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
其中getClass().getName()对应的结果就是:com.itheima.api.system.demo04.Student;Integer.toHexString(hashCode())对应的结果就是3f3afe78。
我们常常将"com.itheima.api.system.demo04.Student@3f3afe78"这一部分称之为对象的内存地址值。但是一般情况下获取对象的内存地址值没有太大的意义。获取对象的成员变量的字符串拼接形式才
算有意义,怎么实现呢?此时我们就需要在Student类中重写Object的toString方法。我们可以通过idea开发工具进行实现,具体步骤如下所示:
- 在空白处使用快捷键:alt + insert。此时会弹出如下的对话框
- 选择toString,此时会弹出如下的对话框
同时选择name和age属性,点击OK。此时就会完成toString方法的重写,代码如下所示:
@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age='" + age + '\'' + '}'; }
这段代码就是把Student类中的成员变量进行了字符串的拼接。重写完毕以后,再次运行程序,控制台输出结果如下所示:
s1对象的字符串表现形式为:Student{name='itheima', age='14'}
此时我们就可以清楚的查看Student的成员变量值,因此重写toString方法的意义就是以良好的格式,更方便的展示对象中的属性值
我们再来查看一下如下代码的输出:
// 创建学生对象 Student s1 = new Student("itheima" , "14") ; // 直接输出对象s1 System.out.println(s1);
运行程序进行测试,控制台输出结果如下所示:
Student{name='itheima', age='14'}
我们可以看到和刚才的输出结果是一致的。那么此时也就证明直接输出一个对象,那么会默认调用对象的toString方法,因此如上代码的等同于如下代码:
// 创建学生对象 Student s1 = new Student("itheima" , "14") ; // 调用s1的toString方法,把结果进行输出 System.out.println(s1.toString());
因此后期为了方便进行测试,我们常常是通过输出语句直接输出一个对象的名称。
小结:
- 在通过输出语句输出一个对象时,默认调用的就是toString()方法
- 输出地址值一般没有意义,我们可以通过重写toString方法去输出对应的成员变量信息(快捷键:atl + insert , 空白处 右键 -> Generate -> 选择toString)
- toString方法的作用:以良好的格式,更方便的展示对象中的属性值
- 一般情况下Jdk所提供的类都会重写Object类中的toString方法