Object类是Java中所有类的始祖,在Java中每个类都扩展了Object,但不需要显式继承extends它。尽管也允许继承Object类,但因为Java是单继承的,且不继承Object类也可以像使用父类一样使用它,默认是继承Object类,所以显式继承Object类没有意义。
由于Java中每个类都是由Object类扩展而来,所以熟悉这个类的相关方法和服务很重要。
1、Object类型的变量
可以使用Object类型的变量引用任何类型的对象:Object obj = new 自定义类名();
但Object类型的变量,只能用于作为各种值的一个泛型容器,不能直接访问原类型的成员,还需要知道对象的原始类型,并进行强制转换才可以使用。
自定义类名 变量名 = (自定义类名)obj;
2、getClass() 方法
getClass()方法会返回泛型Class类对象,代表正在运行中的类和接口的实例,用于支持反射的操作类型。
3、equals() 方法
Object类中的equals() 方法用于检测一个对象是否等于另外一个对象。Object类中实现的equals方法将确定两个对象引用是否相等。对象被创建时,如果不赋值给变量,被称为临时对象使用完就会被JVM回收(可能不是立即)。如果声明变量并把创建对象赋值给新建变量: A a = new A();
这里 A a 是声明了一个A类型的名字为a的变量,与值类型赋值不同,这里a变量实际上获得了新创建的A类型对象的堆内存地址,而不是对象本身。因此当两个对象的变量在做==判断时,实际上是判断两者变量所指向的堆内存地址是否相同。
比较两个对象的引用地址是否相等
对于很多类来说这就足够了,但实际开发中经常需要基于属性和状态检测对象的相等性,比如两个员工对象的姓名、薪水和入职日期一致,就可以认为是相等的。因此,我们在一些情况下经常需要重写equals方法。
比较完美的equals方法建议,可根据需求添加或去掉监测条件
4、hashCode() 方法
散列码hashcode是由对象导出的一个整形值。散列码是没有规律的。如果a和b是两个不同的对象,a.hashCode()和b.hashCode()基本不会相同(存在相同的可能即hash碰撞)。Object类的默认hashCode方法会从对象的存储地址得出散列码。
String类使用以下算法计算散列码:
int hash = 0;
for (int i = 0; i < length(); i++)
hash = 31 * hash + charAt(i);
可以根据对象的变量,按合理的规则组合多个散列值生成hashcode()方法
也可以调用 Objects.hash() 来组合散列值,更简单
几个java提供的hashcode():
Objects:
所有的封装类:
Integer类的
Long类的,其他不一一列举
Arrays类:
传入类型可以是Object、int、long、short、char、byte、boolean、float、double
不一一列举
5、toString() 方法
在Object类中还有一个重要的方法,就是toString()方法,它会返回代表对象值的一个字符串。
Object类源码实现方式
只要一个对象与字符串通过操作符"+"连接起来,jvm会自动调用该对象的toString()方法来获得这个对象的字符串描述。
toString()方法是一种非常有用的调试工具,可以重写它便于实际开发中调试。