Object类解析
来源:互联网 发布:观辰软件 编辑:程序博客网 时间:2024/05/06 02:19
亲,你知道java中Object类中共有几个方法吗?是的一共有11个方法。如果不知道请你现在牢记 !
- clone() // protected
- finalize() // protected
- eqauls(Object obj) //public
- getClass() //public final
- toString() //public
- hashCode() //public
- notify() //public final
- notifyAll() //public final
- wait() //public final
- wait(long timeout) //public final
- wati(long timeout, long nanio) //public final
其中能够被重写的方法有5个:clone(), finalize(), hashCode(), equals(Object obj), toString(), 剩下的6个方法是不能被重写的,因这方法定定义成了final类型。虽然Object是所有类的超类,超类中被protected修饰符所修饰的成员变理和成员方法都可以被当前类、同一package、子类所引用,但是Object类中被protected所修饰的两个方法clone(), finalize()却不能直接被子类引用。
clone()不能被直接调用的原因是:多数java开发者认为这是一个bug,clone不应该出现在object方法中,既然出现了却不能直接使用,非让类去实现一个没有一个方法的接口类java.lang.Cloneable,才能调用clone()方法。因为只有类实现了Cloneable接口后才能通过Overried clone方法后顺利的完成调用,否则即使Overried clone也会抛出CloneNotSupportedException 异常。所以为了避免出错,即使是Object的子类也是不能直接去调用clone方法的。
finalize()不能被直接调用的原因是:在java设计中finalize是用来显式的进行垃圾回收,由垃圾回收器调用。java的垃圾回收都是自动回收的,虚拟机也不能保证在调用finalize()后便能顺利完成回收工作,所以这个方法是被垃圾回收器调用的,做为Object的子类没有必要直接就能调用,但是可以重写这个方法,在这个方法内部加上自己的逻辑。
clone内容延伸:克隆分为深copy和浅copy。深copy是指变量里面的成员变量也指向一个对象,浅copy是指普通的java 8种基本类型及其对应的包装类变量。深copy很容易出现问题,例如一个对象变量里面引用了一个输入流,被深copy出另一个对象后,若源对象把输入流关闭了,那么深copy出来的对象也不能正常使用了。一般实现Cloneable接口,最好将protected修饰符改为public,否则本方法仅限于本类、同一package下、子类使用。
equals(Object obj)内容延伸:在Object内中equals方法实现如下:
public boolean equals(Object obj) {return (this == obj); }
`==`专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同。要比较两个基本类型或两个引用变量是否相等,只能用==操作符。
equals方法是用来比较两个独立的对象内容是否相同。如果一个类没有自己Overrid equals方法,那么它就继承Object类的equals方法,代码如上。上面的代码使用了==操作符,那就是用来比较两个变量是否相同,即是否指向同一个对象,这时使用==和equals得到的是同样的结果,如果是比较两个独立的对象那些方法总返回false。
getClass内容延伸:如果一个java bean A继承了一个java bean B,那么在类A中的toString方法如下:
@Override public String toString() {return super.getClass().getName() + "# ChineseBook [ahthor=" + ahthor + "]"; }
那么再调用toString方法后结果会是怎么样呢?
选项一: B# ChineseBook [ahthor=莫言]
选项二: A# ChineseBook [ahthor=莫言]
你会选择哪种结果呢,答案是选项二。为什么是选项二呢?按理来讲使用super关键字,那就应该去调用父类啊,super.getClass()这样就得到类B了。其实不然,因为getClass()方法被定义成final类型了,就是说它不能被子类覆盖,getClass()方法是返回正在运行时对象,那么super.getClass()就相当于this.getClass()得到的还是当前类A,因为此时运行的类是A,结果就是选项二了。
hashCode内容延伸:hashCode一般与equals一起使用,hashCode返回对象的哈希码,hashMap, hashSet就是使用hashCode来存储对象的集合。它们的实现方式是首先根据hashCode找到对应的存储区域,最后取出该存储区域内的每个元素与该对象进行equals方法比较。
- Object类解析
- Object类源码解析
- Object类源码解析
- java.lang解析Object类
- Java-Object类源码解析
- JAVA 1.6源码解析-Object类
- java object解析
- unity源码解析Object
- Object源码解析
- 解析object sender,EventArgs e
- Java之Object源码解析
- Object-c 中Extension解析
- 解析 神奇的 Object.defineProperty
- JSON数据解析之Object
- 解析神奇的 Object.defineProperty
- 解析 神奇的 Object.defineProperty
- Java源代码解析—Object
- 解析 神奇的 Object.defineProperty
- 将eclipse新建项目的默认编码GBK改为UTF-8
- 如何实现ScrolledComposite下 控件个数随着窗口大小自动变化
- 第一个安卓程序
- 移植tslib,测试电容屏
- 数字图像处理(笔记3)
- Object类解析
- LeetCode OJ :Reverse Words in a String
- Redis (一) 安装
- GDB的使用
- rt_thread 线程管理
- 路由器让外网访问内网的计算机和设备
- ThinkPHP 在WAMP下面部署多模块出现错误,namespace 在不同环境的用法是不一样的
- 安卓环境配置疑难解答
- 进程上下文与中断上下文