“万物皆对象” - 万物皆 是 对象
is - a
extends
【Object类】
java.lang.Object - 对象,java中所有类型的父类
* java.lang
java的语言包,使用这个包中的类不需要导包
1. 构造器
Object只有一个默认的无参构造
2. 方法
protected Object clone()
创建并返回此对象的一个副本。(复制品)
本类,本包子类中才能使用
除了数组以外,子类需要实现cloneable接口(空的接口,标志接口)才能使用clone方法
问题:重写父类方法时,能不能修改访问修饰符?
看情况,访问范围只能变大,不能变小
public boolean equals(Object obj)
api中不写访问修饰符,不是表示default,而是public
判断两个对象是否“相等”,
equals的默认实现就是==,本质就是判断2个引用是否指向同一个对象
但是可以通过重写equals方法修改它的实现过程(比较依据)
重写equals方法需要注意5项原则
equals 方法在非空对象引用上实现相等关系:
- 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
- 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
- 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
- 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
protected void finalize()
1. 垃圾:没有引用指向的对象
2. 当这种对象被回收时,就会调用一次此方法
3. 默认没有实现过程
4. 可以通过重写这个方法,在对象被回收时,顺便回收一些别的垃圾对象
很不建议这样做
Class<?> getClass()
返回类对象
int hashCode()
返回该对象的哈希码值。
3个规定:
1. 同一个对象,多次调用hashCode结果【必须】一致
2. equals认为相等的对象,hashCode的结果【必须】一致
3. equals认为不相等的对象,hashCode的结果【最好】不一致
* 只要重写了equals方法,第2个规定必然会不满足
所以重写equals必须也重写hashCode方法,使得其满足条件2
String toString()
变成字符串
默认实现 类名@哈希值
往往可以通过重写这个方法,来打印出对象的成员属性的值,方便调试程序
* 问题:
为什么 String、StringBuilder、StringBuffer 对象直接打印的时候是内容,
而我自己写的Student类 打印出来却是 com.bwf.Student@65fea7 ?
因为这些类型已经重写过toString方法了,而我自己的类没有重写
* 问题
为什么 String类型比较内容要用equals方法,而我自己的类用equals和==是一样的?
因为 String 类型已经重写过 equals方法了
其他方法
void notify()
void notifyAll()
void wait()
void wait(long timeout)
void wait(long timeout, int nanos)
都是在线程控制中使用,以后再说