1. Object类介绍
Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起。
Object类是java中所有类的父类,每个类都使用 Object
作为超类。所有对象(包数数组,String,Class , Method)都实现这个类的方法。具体的关系视图如下:
--class Animal { }
--class Cat extends Animal { }
--class Poss extends Cat { }
则实际的关系为:
Object ----- Animal ----- Cat ----- Poss
大家可能会说,这样的继承继承关系有什么好处,但是实际上,这样的继承关系,很好的体现了java的思想。我们将所有类都公用的方法集成出来,让所有的类都具有Object类中的方法。
2. Object类方法介绍
Object的文档中写了如下方法:
protected Object | clone() |
boolean | equals(Object obj) |
protected void | finalize() |
Class<?> | getClass() |
int | hashCode() |
void | notify() |
void | notifyAll() |
toString() | |
void | wait() |
void | wait(long timeout) |
void | wait(long timeout, int nanos) |
大家看这个可能并不十分清楚,那么久让我为大家解释一下:
protected Object | clone() |
boolean | equals(Object obj) |
protected void | finalize() 此方法和System.gc的效果相同,只是通知java虚拟机清理,但是只是起通知的作用 |
Class<?> | getClass() 运行时类,也就是实现类。在继承之前已经说过,Animal animal = new Cat();那么实现类就是Cat类。返回的需要注意,返回的是类对象,这个方法十分重要,在后期接触到的反射、动态代理、工厂模式和框架中,应用的十分频繁。 **** 重要 |
int | hashCode() 每个对象都对应一个唯一的hashCode,根据不同的哈希散列算法算出来的数值。本质上是一个32位的二进制,根据哈希散列算法使不同对象均匀散列在哈希码的取值范围之内。人为认定哈希码值是唯一的。对象存储的时候,也是根据元素的哈希码来存储的。哈希码相同内存碰撞,原来的后挪一位,新产生的放在原处。 |
void | notify() 这个方法以及下面的wait方法都是主要在线程的部分用到,多线程编程会考虑到线程安全问题,如果有需要,可以将需要的线程唤醒,其他线程设置为等待。notifyAll()是唤醒全部,wait是线程等待 |
void | notifyAll() |
toString() toString方法是一个很常用的方法,可以用来打桩输出对象信息,进行更有效的调试。 如果没有重写toString方法,输出的是对象的类名+地址,如果重写了,输出重写的内容。 | |
void | wait() |
void | wait(long timeout) |
void | wait(long timeout, int nanos) |
3. Object类扩展
Object是一个非常重要的类,因为不仅提供了一套共有的方法,也为继承类书写了共有方法的规范。
需要注意的equals(Object obj)方法,在后续集合部分,用到set集合时,需要对自己书写的对象重写equals方法,同时也必须重写或实现hashCode方法。建议重新写步骤是:
比较地址---比较hashCode----比较成员属性。代码如下:
publicboolean equals(Object obj){
//判断地址
if(this == obj){
returntrue;
}
//判断为空 null调用方法或者属性会空指针异常
if(obj == null ){
returnfalse;
}
//判断数据类型是否相等
if(this.getClass()!= obj.getClass()){
returnfalse;
}
//判断属性值是否一致
Personb = (Person) obj;
if(this.age != b.age){
returnfalse;
}
//两个字符串对象的地址或者属性相同并且都不能为空
if(this.name == b.name || b.name.equals(this.name) && this.name == null && b.name == null){
returntrue;
}
returnfalse;
}