一、什么是根父类
1、Java中规定:如果一个类没有显示声明它的父类,即没有写extends xx,那么这个类就默认继承java.lang,Object
如上图,我们随便一个类都是继承的Object
类Object是类层次结构的根类,每个类都使用Object作为超类(父类)
2、如何理解根父类
(1)所有对象(包括数组)都实现这个类的方法
换句话说,Object类中声明的方法,所有引用数据类型(包括数组)中都有
二、为什么需要它,它能做什么
(1)所有对象(包括数组)都实现这个类的方法,换句话说Object类中声明的方法,所有引用数据类型(包括数组)中都有
(2)所有类的对象的实例化过程,都会调用Object的实例初始化方法
(3)所有的对象都可以赋值给Object的变量,或者说Object类型的变量,形参,数组可以接收任意类型的对象。
三、怎么用
用法以及注意点:
四、根父类的常用方法
下面说几个最常用的方法
(1)、toString()
完整来说即是public Stringc toString()
重写后的效果是未重写效果是不一样的,我们建议重写
代码如下:
(2)、getClass
因为int是非引用数据类型(int类型是值类型)
(3)、finalize
a、什么是 finalize()方法,它有什么用?
java.lang.Object的方法:
protected void finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器(GC)调用此方法。 即不是程序员手动调用
子类重写 finalize 方法,以配置系统资源或执行其他清除。
b、什么情况下用,怎么用
①某个对象确定要被回收了,比喻成“留临终遗言”
②Java程序员是否无法确定具体哪个时间点会调用
③它是由GC调用的
④每一个对象,finalize()只能被调用一次。
如果某个对象在被GC回收之前复活了,那么再死的时候,就不会调用finalize()
当我们在finalize()方法中又让一个引用指向了当前对象this,那么这个对象就复活。
如上代码,我们并没有调用输出的finalize方法,但是gc里面主动帮我们调用了
以上例子中 其实finalize我们一般不需要去重写,只是为了让我们搞懂,在什么时候gc会帮我们调用它(我们比喻成“临终遗言””)
c、常见面试题
面试题:final,finalize,finally的区别?
(4)、equals和hashCode
equals 和 hashCode为什么一起讲,因为他们本身就经常一起出现,干脆就一起讲了
想看官方说明
a、hashCode
public int hashCode():返回该对象的哈希码值。支持此方法是为了提高哈希表的性能。
提高哈希表的性能,言外之意就是,对象存到某种格式的时候才有用
哈希码值是用这个对象的信息(属性值),通过某种算法,计算出来的一个int值。就好比我们身份证号码代表一个人的信息。
理想状态下,那么每一个对象都应该有一个唯一的哈希码值,现实中,两个不同的对象,可能它的哈希码值相同。
认为:如果两个对象的哈希码值不同,就可以认为这个两个对象一定不“相等”,但是,如果两个对象的哈希码值相同,我们不能认为这个两个对象就一定“相等”,可能相同,也可能不同。
public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
b、equals
public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
换句话说,如果最终要确定两个对象是否“相等”要依据equals方法。
默认情况下,Object类中实现的equals方法,即如果我们自己写的类,没有重写equals方法的话,那么它的比较是等价于“==”,比较的是对象的“地址值”
如果重写会怎么样呢?
我们可以选择进行重写:
(1)当此方法equals被重写时,通常有必要重写 hashCode 方法(意思就是你重写了equals()就要重写hashCode())
为什么?
因为:
Java中规定
①如果两个对象调用equals方法返回true,那么这两个对象的hashCode值必须相同
②如果两个对象的hashCode值不同,那么调用equals方法必须是false
③如果两个对象的hashCode值相同,那么调用equals方法可能true也可能false(怎么理解?)(2)重写equals方法时,要遵循几个原则
①自反性: x.equals(x)一定true 【即 自己跟自己比较一定是true】
②对称性:x.equals(y) 和y.equals(x)结果一样
③传递性: x.equals(y)是true,y.equals(z)也是true,那么x.equals(z)一定true
④一致性:只要参与equals比较的属性值没有修改过,那么无论何时调用,结果都应该一样
⑤对于任何非空引用值 x,x.equals(null) 都应返回 false【即,你用非空对象和空对象比较一定是false】
乍一看,完了,这么多要求,我们还能重写吗,看起来很复杂!
不用担心
ALT+shift+S
一选择,hashCode()【注意包括了equals】就写完了,当然你觉得它写的不好,可以选择自己写,但是你自己写算法一定要遵循上面的原则
那么重写后会怎么样呢?
但是不管怎么样,字符型的比较,不管是不是常量,开发当中都一定是用equals去比较