面向对象编程
Object类
1 关于Object类
java.lang.Object
,即我们所说的Object
类是所有类的根父类。我们所说的类
可以理解为是引用数据类型
,也就是说,Object
类是所有引用数据类型
的直接或间接父类,总之就是所有类
的父类。
对于那些没有使用extends
关键字指明其直接父类的类
,它们的直接父类就是Object
类。
由于Object
类是所有类的父类,因此,所有类都具备Object
类的成员,也就都可以使用Object
类中的成员,通常就是使用其中的方法。
换句话说,Object
类中的方法是通用方法、所有类都适用的方法。
2 Object类中的成员
1)属性Object
类中没有定义属性。
2) 构造器Object
类中只有一个空参构造器。
3)方法
clone():
- protected Object clone() throws CloneNotSupportedException
- 简单地说,该方法
x.clone()
就是复制一份x
对象,返回值就是x
的复制对象,它与x
的互相独立的。详细地细节,需要学习包括接口
的其他知识。
equals():
- public boolean equals(Object obj)
equals()
方法常常与==
比较,这里将二者详细说明一下:
(1)==
:- 是运算符,适用于基本数据类型变量和引用数据类型变量,左右两边的变量必须是统一的,也就是说能够统一成一个类型。
==
本质上比的是两个变量对应的存储空间中的值。也就是说,对于基本数据类型,==
比较的是两个基本数据类型的值,对于引用数据类型,==
比较的是两个引用数据类型变量对应的存储空间中保存的地址值。
(2)equals()
:- 是方法,因此只适用于(非
null
)对象。 - 没有重写的
Object
的equals()
方法,本质上就是利用==
来比较两个对象,也就是仍然是比较两个对象的地址值。 - 通常,像String、Date、File、包装类等都重写了
Object
类中的equals()
方法,实现的就是比较两个对象的内容是否相同。对于同一个类的两个实例化对象,它们的内容本质上就是属性和方法,方法都是类中的,所以都是一致的,只有属性是实例化时初始化的,可能不同,因此重写equals()
方法就是比较两个对象的属性是否相同。 - 一般情况,我们自定义的类都会重写
Object
中的equals()
方法,实现对两个对象的内容的比较。通常,我们是通过自动实现的。自动实现时会发现,自动代码中特别注意了null
,并且在重写equals()
方法的同时会重写hashCode()
方法,具体参照Object
类中的equals()
方法的解释。 - 官方解释
equals()
方法,主要注意以下几点:
(1)equals()
方法比较的是非null
对象,任何对象与null
通过equals
比较结果都是false
。
(2)equals()
方法的原型,即未重写的代码,本质上是==
比较。
(3)重写equals()
方法必须也重写hashCode()
方法,因为要求通过equals()
方法判断的两个相等的对象,其二者的hashCode
也相等。
finalize():
- protected void finalize() throws Throwable
- 简单地说,该方法
x.finalize
是由垃圾回收器来调用,当垃圾回收器确定没有任何引用指向x
了,此时垃圾回收器就想要将x
作为垃圾回收,在垃圾回收器做这个操作之前,会调用x.finalize
。也就是说,在x
没有被任何指针指向后,在垃圾回收器要将x
作为垃圾处理之前,x.finalize
方法会被调用,调用后不代表x
就会被回收,因为有可能finalize
方法本身实现了对x
的重新引用,这时x
就不会被垃圾回收器处理。 - 在对象被回收之前,垃圾回收器会调用该对象的
finalize
方法,不建议主动去调用该方法,一般由垃圾回收器自动地调用该方法。
getClass():
- public final Class<?> getClass()
- 简单地说,该方法
x.getClass()
用于返回x
的所属类对象。也就是说,该方法返回的是构造出x
的类。后续学习会进一步学习该方法。
hashCode():
- public int hashCode()
- 待补充(集合)
notify():
- public final void notify()
- 待补充(线程通信)
notifyAll():
- public final void notifyAll()
- 待补充(线程通信)
toString():
- public String toString()
toString()
方法返回的是代表该对象的字符串。
没有被重写的Object
类中的toString()
方法返回的代表对象的字符串是由该对象的类名、@和该对象的哈希代码的无符号十六进制所构成。具体参照官方文档中所给出的定义。
简单地说,Object
类中的toString()
方法返回的是该对象的地址值。- 需要注意的是,在使用
print
来打印一个没有重写toString()
方法的对象时,打印结果也是该对象的地址值,实际上,print
一个对象的本质就是调用了该对象的toString()
方法。
但需要注意一点,对于声明为null
的某个类的变量,print
打印中有一个保护机制会判断打印的变量是否是null
,如果是null
则直接打印null
,只有非null
时才会去调用对应的toString()
方法。因为值为null
的对象调用方法会报空指针异常错误。 - 像String、Date、File、包装类等都重写了
Object
类中的toString
方法。重写toString()
方法的目标是能够得到最能代表该对象的字符串,通常就是我们对这个对象最关心的属性。一般选择自动生成重写该方法的代码。
wait():
- public final void wait() throws InterruptedException
- 待补充(线程通信)
wait(long timeout):
- public final void wait(long timeout) throws InterruptedException
- 待补充(线程通信)
wait(long timeout, int nanos):
- public final void wait(long timeout, int nanos) throws InterruptedException
- 待补充(线程通信)