Object类(java语言中所有的类都默认继承于Object类,俗称上帝类)
常用方法:
getClass()方法
public final Class<?>getClass():
作用:返回此对象运行时类的Class对象。即当前正在运行的类的class字节文件对象,无参;
例如:在一个学生类中使用getClass()方法:
toString()方法
public String toString()
作用:返回对象的字符串表示形式。默认格式:类名 + @ +哈希码值。
重写此方法可以自定义对象的输出格式。(建议重写,方便阅读!!!)
例如:在学生类中重写toString()方法和不重写的区别:
在一个学生类中不重写toString()方法:
在一个学生类中重写toString()方法:
equals(Object obj)方法
public boolean equals(Object obj)
作用:用于比较两个对象是否相等,有参数(参数就是与需要比较的对象)。对象均有内存地址和和其具体内容,而object中的equals方法是比较的两个对象内存地址是否相同,即obj1.equals(obj2)为true,这表示两者是引用同一个对象,但在实际开发中,大部分是两个对象之间的比较,此时再用object的equals方法就不行了,因此就要根据自己的需求重写equals方法,java中的String类,Math类等均对equals方法进行了重写。
equals方法重写遵循规则 1、自反性 :对于任何非空引用值 x,x.equals(x) 都应返回 true。 2、对称性 : 对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。 3、传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true, 那么x.equals(z) 应返回 true。 4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是 对象上 equals 比较中所用的信息没有被修改。 5、对于任何非空引用值 x,x.equals(null) 都应返回 false。
重写equals()方法时建议同时重写hashcode()方法!!!
原因:首先,equals方法与hashCode有如下的关系
1、如果两个对象相同(即equals比较返回true),那么两者hashCode相同
2、如果两个对象hashCode比较相同,那么它们并不一定相同(即equals比较返回false)
由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那就没必要在进行equals的比较了,这样就大大减少了equals比较的次数,这对需要比较的数量很大时效率提高是很明显的
例如:比较学生对象,在学生类中重写equals()方法和不重写的区别:
不重写equals()方法:
重写equals()方法:
hashcode()方法
public int hashCode()
作用:返回对象的唯一hashcode码(理想状态下是每一个对象都有唯一的hashcode码,但是这个目前没有实现,也就是说不同对象的hashCode码可能会相同)。
在java中hashcode方法是Object类的native方法,返回值为int类型,根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。
作用:在java中hashcode是用于快速查找对象物理存储区使用的,主要作用于散列集合(HashSet,HashMap,HashTable...),在插入散列集合前需要判断obj(对象/元素)是否存在,首先判断插入obj(对象/元素)的hashcode值是否存在,hashcode值不存在则直接插入集合,hashcode值存在还需判断,用equals方法判断对象是否相等。使用hashcode码确定对象存放区,若存放区不存在则对象一定不存在无需equals判断直接插入。若该区存在只比较该区对象的equals判断。这种方法可以大量节省判断时间。
比如:简单获取某个对象的hashCode码
clone()方法
protected Object clone() throws CloneNotSupportedException
作用:创建并返回此对象的副本。也可以叫做克隆,复制。在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。此方法返回的对象与此方法无关!
注意:调用此方法需要重写此方法,因为此方法的在Object类中的修饰符是protecte,并且这个对象的类必须实现Cloneable接口,否则会抛出CloneNotSupportedException(不支持克隆异常)此异常是编译时异常!!!
在java语言中,有几种方式可以创建对象呢?
1、使用new操作符创建一个对象
2、 使用clone方法复制一个对象
两种方式的区别: new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后,一个对象创建完毕,可以把他的引用(地址)发布到外部,在外部就可以使用这个引用操纵这个对象。而clone在第一步是和new相似的, 都是分配内存,调用clone方法时,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。
比如:克隆学生类的对象,不实现Cloneable接口和实现Cloneable接口的区别
不实现Cloneable接口:
实现Cloneable接口:
线程方法集wait()、notify()、notifyAll()
public final void notify() //notify()方法 无参 public final void notifyAll() //notifyAll()方法 无参 public final void wait() throws InterruptedException //wait()方法 无参 public final void wait(long timeout) throws InterruptedException//wait()方法 有参
作用:
notify()方法:唤醒正在等待对象监视器(关键字:synchronized)的单个线程。如果多个线程正在等待这个监视器对象,其中一个线程被唤醒,选择是任意的,线程通过调用wait()方法之一等待对象的监视器。
notifyAll()方法:唤醒正在等待对象监视器的所有线程,线程通过调用wait()方法之一等待对象的监视器。
wait()方法:使当前线程一直等待直到另一个线程调用此对象的notify()方法或jnotifyAll()方法,调用wait方法后,当前线程会释放此监视器的所有权,并等待另一个线程通过调用notify方法或notifyAll方法来唤醒。
wait(long timeout)方法:使线程主动释放对象锁,并进入等待状态,直到它被其他线程通过notify()或notifyAll唤醒或者超过指定的等待时间。如果超过指定的时间,线程也会被唤醒。在调用wait方法前,线程必须获得该对象的对象锁,即:只能在同步方法或同步代码块中调用wait方法,如果当前线程不是锁的持有者,将抛出一个IllegalMonitorStateException异常(是RuntimeException的子类,故不需要捕获)。
wait方法执行完成后,该线程立即释放持有的对象锁(注:不是等到退出synchronized代码块后才释放)。