Object类

why Object?

最近要看看Java基础的一些知识,打算写点博客自己总结下。刚开始打算从String开始,但是在看String的时候,发现有个东西绕不过去,对就是Object,这是个什么鬼?好像String里面的equals()方法,toString()方法都是从Object继承的。对于它我是既熟悉又陌生,因为在平时的编程中是没有直接用到它的,但是我又知道,它时刻存在。这次是绕不过去了,那就击碎它。

what is Object ?

jdk文档的翻译:类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
(补充:Java中只有基本类型不是对象,例如:数值,字符和布尔类型。)

下面就看看它拥有的几个方法,先从最常用的开始吧。
一、equals()方法
这个比较熟悉,平时用的比较多,但是jdk是如何实现的?这倒是很好奇。

指示其他某个对象是否与此对象“相等”。

public boolean equals(Object obj) {
        return (this == obj);
}

一直对自己写的代码不太放心,看到这忽然感觉放松了不少。
这里可以看出,我如果要调用equals()方法,并且没有重写时。默认调用的就是这个equals()方法,它是直接对比两个对象的引用是否相等。
那么,我如果有自己的不同规则,那么就必须要重写该equals()方法。

找个String的equals()方法,看看jdk是如何做的。

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
    }
if (anObject instanceof String) {
        String anotherString = (String) anObject;
    int n = value.length;
    if (n == anotherString.value.length) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = 0;
        while (n-- != 0) {
            if (v1[i] != v2[i])
                return false;
                    i++;
        }
        return true;
     }
  }
return false;
}

可以看到String的对比是将字符串转为char数组,按照每个字符进行比较的。
二、toString()方法

返回该对象的字符串表示。

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

看到这个忽然明白,有时候不重写一个类的toString()方法,直接调用默认的toString()方法,返回的就是上面这个值。
该类的类名+@+该类的哈希码的十六进制
至于上面是哈希码,这个貌似又不清楚了,这个回头再看吧

三、getClass()方法

返回此 Object 的运行时类。

public final native Class<?> getClass();

任何一个类的对象都可以调用该方法获取类的相关信息,基本不用重写就可以使用。
但是native关键字貌似没有见过。然后该方法好像也没有实现。
其实是因为:这个关键字修饰的方法,表示该方法是一个本地方法。他的具体的实现此c/c++等其他语言开发的。
这种做法也叫JNI实现,即:Java本地接口。

四、hashCode()方法

返回该对象的哈希码值。

public native int hashCode();

该方法也是由JNI实现的。其值为对象的存储地址。
如果重新定义equals()方法,就必须重新定义hashCode方法。这和散列表的使用有关,详细后边再看吧。
同时String也是重写了该方法的,因为它重新定义了equals方法。

五、finalize()方法

当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

protected void finalize() throws Throwable { }

这个方法是由GC来调用的,我自己应该是用不到的。

Java是怎么继承它的?

我知道Object类是所有类的超类,也就是父类或基类。
但是,我并没有继承这个类啊!那么我是怎么继承它的?

默认情况下,在没有明确的给出超类的情况下,Java会自动把Object作为要定义类的超类。(至于具体是怎么实现的,实在是没有查到,如果哪位大神知道,请不吝指教)
那么也就意味着,你要继承的基类已经继承了Object,所以它的子类就不需要再继承Object类了。这样所有的类都可以使用Object类中定义的方法了。

总结:

相信有了这些知识,在平时使用object对象,equals方法,toString方法时不至于再那么困惑了。同时看了这些jdk的实现,对平时的编程习惯和思考方式都有所影响。object的存在,对于程序的编写到底产生了怎么样正面的影响,还要再继续思考。

参考:《Java编程思想》、《Java核心编程:卷Ⅰ》

限于本人水平有限,如有不正之处,还请不吝指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值