在东方神话体系中,人类是如何来的?
是女娲用泥土捏出来的。
在西方神话体系中,人类是如何来的?
是亚当夏娃的后代。
今天要学的Object类在Java里面,就好比是和亚当夏娃一样的存在。
只不过神话终归只是神话,是虚无缥缈的,但是计算机里面,Object类是真真实实存在的。
Object类是所有类的根类,顶层父类,就可以理解成是所有类的祖先,也就是说所有的类最终都会继承至它,包括数组的父类,也是Object类。
用代码证明:
①getClass():得到类名。
②getSuperClass():得到父类名。
③Class是指类,java.lang这是Java里面的一个包,类名是Object。
所以数组的父类也就是Object.。
如果一个类没有特别指定父类,那么默认继承自Object类。
既然Object类是顶层父类,那么按照继承的规则:子类可以调用父类的方法。
Object类中的方法,所有类都可以使用。Object类当中包含的方法有11个。
今天主要学习其中的2个:
①创建Person类,没有指定父类,那它默认继承Object类。
②在测试类main方法中,创建对应的person对象并初始化。
③调用toString()方法并打印(注意:Person类中并没有定义toString()方法,它调用的是父类Object的方法)。
④打印结果为一串字符,前面一大串是我自己在开发工具里面创建的包名,就可以理解成文件夹:
那么Person@16e8e0a这串字符到底啥意思呢,这就要看下Object类中的toString()方法是啥样的了。
下图为Object类的toString()方法:
①getClass().getName():得到类的名字,类名是Person。
②Integer.toHexString(hashCode()):hashCode得到的是一个地址值,将这个地址值转化成十六进制,也就是说16e8e0a是一串16进制的数字。
好,现在问题来了,对于开发者来说,地址是没多大的意义的,我们需要的是你能以字符串的形式展现出来而不是给我一串地址。
前面学过String类,知道它打印出来就是一串字符串,而不是一串地址,怎么做到的?
因为它将方法重写了。
下图为String类的toString()方法
String类的父类是Object类,它将父类的toString方法重写了。
所以,当我们新建一个类的时候,一般都会将toString()方法重写,因为地址对于开发者来说意义不大,我们需要的是字符串。
利用开发工具快捷键,Alt+Insert,会自动帮重写toString()方法。
作用:判断其他某个对象是否与此对象“相等”。
提到equals方法,不得不提到一个比较运算符“==”。
“==”的作用是啥?
①如果比较的是基本数据类型
“==”比较的是值是否相等。
②如果比较的是引用数据类型
“==”比较的是引用地址是否相同。
那equals方法和“==”之间有什么区别呢?
下图为Object类的equals()方法:
Object类中的equals()方法就是运算符“==”,它们是一回事。
类是引用数据类型,所以Object类中的equals()方法,比较的是引用地址是否相同。
那么问题又来了,String类中的equals方法为何比较的是值是否相等呢?
因为它将equals方法重写了。
所以,同toString方法一样,当我们新建一个类的时候,一般都会将equals方法重写。
利用开发工具快捷键,Alt+Insert,会自动帮重写equals方法。
Objects是Object的工具类,前面也学习过Arrays类是数组的工具类。
工具类有个特点:方法一般都是静态方法。
方法可以直接用类名调用,不用创建实例对象。
①直接用Objects工具类类名就可以调用方法。
②Objects中的equals方法。
③这种判断方式更加安全,不会出现空指针异常。
什么叫空指针异常呢?
就是如果一个对象为空,它调用方法就会出现空指针异常。
如下图:
object1为空,调用equals方法就会报错,如果是用Objects类的方法:
Objects.equals(object1,object2)
这样写就不会出现空指针异常。