Java基础详解之基类Object篇
对Java有一定了解的人都知道,Object是Java中所有类的基类,位于类包java.lang下,即使不在类中声明父类,也默认继承了Object类,当然基本数据类型除外,因为那已经不属于类的范畴了。
建议想对Java做深入了解的同学们首先把Object了解清楚,下面详细介绍一下Object的内部方法:
-
protected native Object clone() throws CloneNotSupportedException
本方法用于创建一个当前对象的副本,并返回。但本方法是protected的,只能在类内部或子类里调用,外部无法访问,如果想对外提供对象拷贝的方法的话需要满足下面两个条件:- 被拷贝对象的类需要实现Cloneable接口,否则会抛出CloneNotSupportedException异常
- 重写clone方法或新建一个拷贝方法为公开类型public,然后再内部调用super.clone()进行拷贝操作
public class User implements Cloneable { public User clone() throws CloneNotSupportedException { return (User) super.clone(); } } -
public boolean equals(Object obj)
本方法用于判断两个对象是否“相等”,至于“相等”的意义可由用户通过重写该方法得形式自行定义。
默认该方法的实现为判断this==obj是否成立,也就是判断两个对象的内存地址是否一致。
以下为用户自定义形式的示例,判断两个User对象假如id的值相等则就返回true:
public class User { private Integer id; public boolean equals(User user) { return (this.id.equals(user.getId())); } } -
public final native Class<?> getClass()
本方法用于返回当前对象所属类的类对象,并且要注意,这个返回的对象实际上就是这个类中static synchronized方法所用的同步锁对象。
注意:声明变量使用这个返回值的时候尽量要加上泛型,不然调用Class.newInstance()方法生成对象的时候还要强制转换类型为你想要的类型,示例如下:-
使用方式正常应该为:
Class<? extends ObjectTest> d = new ObjectTest().getClass(); ObjectTest t = d.newInstance();
-
需要强制转化的情况:
Class d = new ObjectTest().getClass(); ObjectTest t = (ObjectTest) d.newInstance();
-
使用方式正常应该为:
-
public native int hashCode()
本方法返回当前对象的哈希码值,通常这个值就是这个对象的内存地址,原则如下:- 同一对象多次调用返回相同的结果
-
当equals方法没有被重写的时候,两个对象equals返回成功,那他们的hashCode也是相同的
-
public final native void notify()
本方法主要用于多线程同步,在已经获得同步对象锁的时候调用本方法将唤醒等待(调用了wait())该对象的一个线程,本篇不做详细介绍,详见:Java基础详解之线程篇
-
public final native void notifyAll()
本方法主要用于多线程同步,在已经获得同步对象锁的时候调用本方法将唤醒等待(调用了wait())该对象的所有线程,本篇不做详细介绍,详见:Java基础详解之线程篇
-
public String toString()
本方法主要用于以字符串的形式返回一个对象的某些信息,默认的实现很简单,就是类名+@+哈希码,源码为::public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } -
public final void wait() throws InterruptedException
本方法主要用于多线程同步,开始等待对象锁,本篇不做详细介绍,详见:Java基础详解之线程篇
-
public final native void wait(long timeout) throws InterruptedException
本方法主要用于多线程同步,开始等待对象锁,与上个方法不同本方法有个参数为超时时间(毫秒),超时后不再继续等待,本篇不做详细介绍,详见:Java基础详解之线程篇
-
public final void wait(long timeout, int nanos) throws InterruptedException
本方法主要用于多线程同步,开始等待对象锁,与上个方法不同本方法有个参数为超时时间(毫秒+微秒),超时后不再继续等待,本篇不做详细介绍,详见:Java基础详解之线程篇
