- getClass()
- final方法,获得运行时类型;
- hashCode()
- 该方法用于哈希查找,可以减少在查找中使用equals的次数,重写equals方法一般都要重写hashCode()
- equals(bject obj)
-
Object源码中使用的是
==
,即比较地址相等 -
引申
==和equals的区别:==:基本数据类型,直接对值进行比较;引用数据类型,对地址进行比较;遇到运算法才会自动拆箱;
equals:类未复写equals方法,则使用equals方法比较两个对象时,相当于==比较; 复写equals方法,比较两个对象时,则走复写之后的判断方式
public static void main(String args[]){ Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 200; Integer f = 200; Long g = 3L; int x = 3; long y = 3L; // 虽然x和y的类型不同,但可以进行直接比较 System.out.println(x==y);//true //Error:(26, 30) java: 不可比较的类型: java.lang.Integer和java.lang.Long // System.out.println((c == g)); //[-128,127]之间,可以自动拆箱 System.out.println(c == d);//true //[-128,127]外的,不能进行自动拆箱,相当于两个对象== System.out.println(e==f);//false System.out.println(e.intValue() == f.intValue());//true System.out.println(c==(a+b));//true System.out.println(c.equals(a+b));//true //遇到运算符+,自动拆箱 System.out.println(g==(a+b));//true System.out.println(g.equals(a+b));//false }
-
关于hashCode与equals
对于两个对象,如果调用equals方法得到的结果为true,那么两个对象的hashCode值必定相等;
如果equals方法得到的结果为false,则两个对象的hashCode不一定不相等;
如果两个对象的hashcode值不相等,则equals方法得到的结果必定为false;
如果两个对象的hashcode值相等,equals方法得到的结果未知。
- clone()
protected native
修饰- 实现对象的
浅复制
,只有实现了Cloneable接口[Cloneable接口是不包含任何方法的!其实这个接口仅仅是一个标志]才可以调用该方法,直接调用Object.clone方法会抛出异常CloneNotSupportedException异常
- toString()
- 一般子类都有该方法,也可自己重写
- notify()
- 唤醒在该对象上等待的某个线程
- notifyAll()
- 唤醒该对象上所有等待的线程
- wait()
- 使当前线程等待该对象的锁,当前线程必须是该对象的拥有者;
- 当前线程会一直等待,知道获得锁或者被中断;
- wait(long timeout):设定一个超时间隔,若在规定的时间内没有获得锁就返回
- finalize()
- 释放资源;
- 不能直接调用该方法:该方法在垃圾回收的时候一定会被执行,若在此之前被执行的话,第一次已经释放掉资源,那么第二次释放资源的时候就会报错,所以finalize方法的访问权限和父类保持一致,为protected
public :同一个类、同一个包、子类、不同包都可访问;
protected:同一个类、同一个包、子类
private:同一个类
default:同一类、同一个包可访问
package java.lang;
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
protected native Object clone() throws CloneNotSupportedException;
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
protected void finalize() throws Throwable { }
}