Java.lang 包—— Object 类
作者: zccst
Object 类是 Java 中所有类的基类或根类,所有 class 的对象(包括数组对象)都继承了 Object 的方法;
Object 类有 1 个构造方法和 11 个成员方法,其中最常用的是:
1. public Boolean equals(Object obj); // 用来比较两个对象是不是相等
2. public String toString(); // 常常被重写以输出一个有意义的字符串
object 类——构造方法及常用方法
public boolean equals(Object obj) 比较当前对象与 obj 是否为同一对象,返回值: ture/false
public String toString() 返回当前对象本身的有关信息,按字符串对象(表达形式)返回
public native int hashCode() ; 返回对象的 Hash 码值。 Hash 码是标志对象的唯一值, Hash 码相同的对象是同一对象
protected Object clone() 创建并返回此对象的一个副本。
public final Class getClass() 获取当前对象所属的类信息,返回此 Object 的运行时类。
protected void finalize()throws Throwable 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
以下三个函数用于控制线程
public final native void notify() ; 唤醒在此对象监视器上等待的单个线程。
public final native void notifyAll() ; 唤醒在此对象监视器上等待的所有线程。
public final native void wait() ; 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
public final native void wait(long timeout) ;在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
public final native void wait(long timeout, int nanos) ;在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。
注: native 型方法指由 C++ 语言编写的方法, Java 解释器对其进行转义后才执行。
重点讲解的方法
1 , equals() :对象内容的比较
比较对象时,一般用 equal() 方法。实际上还是比较对象地址是否相同。
Object 类方法定义: public boolean equals(Object obj){ return (this == obj);}
1). 自反性: s.equals(s) true
2). 对称性: s1.equals(s2) true
s2.equals(s1) true
3). 传递性: s1.equals(s2) true
s2.equals(s3) true
则 s1.equals(s3) true
“ == ”与 equals() ,
两个对象具有相同的类型,及相同的属性值,则称二者相等 (equal)
如果两个引用变量指向的是同一个对象,则称这两个变量 ( 对象 ) 同一 (identical) ( "==" 一般用于基本数据类型比较。若用作两个引用对象比较,仅当引用变量引用同一个对象时,才返回 true, 否则 false 。)
所以,两个对象同一,则肯定相等;两个对象相等,不一定同一。等号“ == ” 判断的是这两个对象是否同一。
注:弄清楚这个问题前提是必须已经准确深刻理解 C++ 中引用和 new 运算符对内存地址操作及区别。
例如:
void EqualCompare()
{
String s1 = new String("Hello");
String s2 = new String("Hello");
String s3 = "Hello";
String s4 = "Hello";
// 未使用 new , s4 引用既存的对象(编译器创建对象之前先进行检测 "Hello" 是否已经存在,若存在,则返回原对象的引用)
System.out.println(s1.equals(s2)); // true x1 行
System.out.println(s1 ==s2); // false 两变量引用不同对象
System.out.println(s3.equals(s4)); // true 两变量引用相同对象
System.out.println(s3 ==s4); // true 两变量引用相同对象
}
不同的类可方便的对该对象进行覆盖。 String 类就覆盖了 Object 类的 equals() 方法,他比较是对象中的内容是否相同。 所以 x1 行输出 true.
子类中也推荐覆盖 Object 类中继承的 equals() 方法,自己制定比较规则。
覆盖 equals() 方法的步骤
boolean equals(Object o){
if(this==o) return true;//1, 看看是不是一个对象
if(o==null) return true;//2, 看看对象是不是空
if(!(o instanceof 本类类名 )) return false ; // 看看是不是本类对象
......// 根据本类设计。
}
a==b 如果 a,b 引用同一对象,则返回 true ;
a.equals(b) 如果 a 对象内容和 b 对象内容相同,则返回 true
如果未重载 equals() 方法的类对象使用该方法与另一个对象进行比较,则调用 Object 的 equals() 方法,仍然是对象的比较,返回值为 false 。
2 , toString() :返回对象的字符串表现形式
toString() :返回对象的字符串表现形式
Object 类中的 toString() 方法他返回的是类名加上他的地址的一个字符串。在子类中推荐覆盖 toString() 方法。
System.out.println(person); 实际上打印的是 person 对象 toString 方法的返回值 .
3 , Clone 方法
根据已存在的对象构造一个新的对象
在根类 Object 中被定义为 protected ,所以需要覆盖为 public
实现 Cloneable 接口,赋予一个对象被克隆的能力 (cloneability)
class MyObject implements Cloneable
{ //…}
4 , getClass 方法
final 方法,返回一个 Class 对象,用来代表对象隶属的类
通过 Class 对象,你可以查询 Class 对象的各种信息:比如它的名字,它的基类,它所实现接口的名字等。
void PrintClassName(Object obj)
{System.out.println("The Object's class is " +obj.getClass().getName());}
5 , finalize 方法
在对象被垃圾回收器回收之前,系统自动调用对象的 finalize 方法
如果要覆盖 finalize 方法,覆盖方法的最后必须调用 super.finalize