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核心编程:卷Ⅰ》
限于本人水平有限,如有不正之处,还请不吝指出。
相关文章推荐
- objective-C学习笔记(五)函数成员:初始化器和析构器
- Objective-C:单例模式
- synchronized(this) VS synchronized( other object)
- Objective-C程序设计 第6版
- iOS开发-通过btn传递两个实例对象 firstObject和secondObject
- 使用ObjectMapper 序列化Json
- Exception starting filter struts2 java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
- IOS之Objective-C学习 工厂模式
- objective-C学习笔记(四)函数成员:方法(函数)
- 详解Objective-C编程中对设计模式中适的配器模式的使用
- 调试SPRING MVC(或者整合SSH)的时候遇到了org/objectweb/asm/Type
- 详解Objective-C设计模式编程中对备忘录模式的运用
- Objective-c编程-Blocks概要
- How to Detect and Track Object With OpenCV
- java object解析
- 《JS高程》JS-Object对象整理
- iOS 图片 的 聊天气泡显示 Objective-C
- Swift/Objective-C-Swift与Objective-C混用教程
- Objective-C和Swift混编的一些经验
- <Troubleshooting> libmawt.so: libXext.so.6: cannot open shared object file: No such file or director