您的位置:首页 > 移动开发 > Objective-C

Object类

2016-03-23 23:14 274 查看

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核心编程:卷Ⅰ》

限于本人水平有限,如有不正之处,还请不吝指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: