Object

Object是所有对象的父类,包括数组。

public final Class<?> getClass()

该方法返回对象在运行时的类型。

这里可以同.class方法做个对比。通常情况下,这两个方法是等价的,不同之处在于:

  1. getClass是实例方法,.class是类方法。
  2. getClass是运行时确定的,而.class在编译时就确定了。

比如:

public class JavaDemo {
    static class Parent {
    }

    static class Child extends Parent {
    }

    public static void main(String[] args) {
        Parent parent = new Parent();
        Child child = new Child();
        System.out.println(parent.getClass() + " " + Parent.class);
        System.out.println(child.getClass() + " " + Child.class);

        Parent proxy = parent;
        System.out.println(proxy.getClass());
        proxy = child;
        System.out.println(proxy.getClass());
    }
}

输出如下:

Parent Parent
Child Child
Parent
Child

public int hashCode()

返回对象的哈希值。该方法用来辅助涉及到哈希表的类,比如HashMap。
哈希值的通用约定如下:

  1. 在Java应用的一次执行过程中,一个对象如果equals方法涉及到的信息没有被修改,那么多次调用hashCode返回值应该相同。多次执行同一应用不做要求。
  2. 如果两个对象通过equals方法比较的结果是相等的,那么hashCode返回值相同。
  3. 如果两个对象通过equals方法比较的结果是不相等的,那么不要求hashCode返回值一定不相同。不过hashCode返回值不同有利于提高哈希表的性能。

该方法默认将对象的内存地址转化为整数值返回。

public boolean equals(Object obj)

判断两个非null对象是否相等。该方法遵循如下规则:
对于任意非null对象x、y、z,有:

  1. 自反性:即x.equals(x) == true
  2. 对称性:当且仅当y.equals(x) == true时,x.equals(y) == true
  3. 传递性:若x.equals(y) == true && y.equals(z) == true,则x.equals(z) == true
  4. 一致性:若equals方法中的信息没有被修改,则多次调用x.equals(y)返回值不变。
  5. x.equals(null) == false

"equals"方法和"=="的区别在于"=="比较的是左右两边是否是同一个对象,而"equals"可自定义,其默认实现同"=="。

需要注意的是,若重写了equals方法,则也需要同时重写hashCode方法,否则可能会违背hashCode方法的第二条约定。

clone

    protected Object clone() throws CloneNotSupportedException {
        if (!(this instanceof Cloneable)) {
            throw new CloneNotSupportedException("Class " + getClass().getName() +
                                                 " doesn't implement Cloneable");
        }

        return internalClone();
    }

拷贝当前对象并返回。这里的拷贝依赖于对象的类型。通常情况下,对任意对象x,有:

  1. x.clone() != x
  2. x.clone().getClass() == x.getClass()
  3. x.clone().equals(x)

但以上规则不是必须的。
通常来讲,返回的对象是通过调用super.clone()获得的,并且新对象与原对象相对独立。也就是说,若类只有原始类型或者不可变类型(比如String)的成员,直接返回super.clone()即可;若包含其他类型的对象,则需要进行“深拷贝”。

由clone方法的实现可知,要想调用clone,需要类实现Cloneable接口。数组类型实现了Cloneable接口,如果是可变对象的数组,默认实现的是浅拷贝。如下:

public class JavaDemo {
    private static class Car {
    }

    public static void main(String[] args) {
        Car car = new Car();
        Car[] cars = {car};
        Car[] cars2 = cars.clone();
        System.out.println(cars ==+ cars2);
        System.out.println(cars[0] == cars2[0]);
    }
}

结果为false true

protected void finalize() throws Throwable

在gc回收对象时调用。子类可覆写该方法来做一些清理工作。JVM无法确保该方法在哪个线程调用。如果该方法抛出未被捕获的异常,则该异常将被忽略,并且终止对该对象的清理。
该方法至多被调用一次。一般用来回收通过特殊渠道申请的内存,比如JNI和c代码。

wait(long millis)

public final void wait(long millis) throws InterruptedException {
        wait(millis, 0);
    }

使当前线程进入等待状态。
要调用该方法,当前线程首先要获取该对象的锁。调用后,当前线程会首先进入该对象的等待池,然后释放该对象的锁。当前线程进入休眠状态,直到以下任意条件触发:

  1. 其他线程调用了该对象的notify方法,并且恰好该线程被唤醒。
  2. 其他线程调用了该对象的notifyAll方法。
  3. 其他线程调用了该线程的interrupt方法。
  4. 该线程的等待时间超过了millis毫秒。

触发以上任意条件后,该线程会被移出该对象的等待池,进入该对象的锁池,与其他线程竞争,等待获取该对象的锁。获取到锁之后,线程会恢复到调用wait之前的状态。

除上述条件外,线程也可能被意外唤醒。虽然这个可能性很小,但是应用应该保证线程在正确条件下被唤醒,如果条件不对,应继续等待。该方法的调用形式如下:

synchronized (obj) {
    while (<condition does not hold>)
        obj.wait(timeout);
    ... // Perform action appropriate to condition
}

需要注意的是,调用该对象的wait方法后,该线程之后释放该对象的锁,其他对象的锁不会释放

public final native void wait(long millis, int nanos) throws InterruptedException

同wait(long millis)。
等待的最大时间为1000000 * millis + nanos纳秒

public final native void wait() throws InterruptedException

与wait(0)相同。

public final native void notify()

唤醒任意一个处于该对象等待池中的线程。

public final native void notifyAll()

唤醒所有处于该对象等待池中的线程。

notify和notifyAll也需要在synchronized语法块中调用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 第一章:Java程序设计概述 Java和C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能...
    loneyzhou阅读 1,246评论 1 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,612评论 18 399
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,373评论 0 4
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,230评论 11 349
  • 不知道为啥,总有一种预感,感觉自己老了八成会得老年痴呆。 想想都会觉得恐怖,明明曾经活得那样轰轰烈烈,记忆却如婴儿...
    星兰相随阅读 136评论 0 0