20180314 java java面向对象-Object类和常用方法

Object类是java语言的根类,它要么是一个类的直接父类,要么是一个类的简介父类。
比如我们声明有个ABC类:
class ABC{}
其实等价于:
class ABC extends Object
{}


所有对象(包括数组)都实现这个类的方法,这句话如何理解?
Object本身就是指对象的意思,我们发现所有的对象都具有某一些共同的行为,我们就抽象出一个类:Object,Object表示对象类,其他都会继承于Object类,也就是拥有Object类里的方法。


Object类的常见方法:
protected  void finalize() :当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法(当垃圾回收器回收某一个对象之前,会先调用该方法,做扫尾操作,该方法我们不要去调用)。 


Class<?> getClass() :返回此 Object 的运行时类(返回当前对象的真实类型)。 


int hashCode():返回该对象的哈希码值(hashCode决定了对象在哈希表中的存储位置,不同对象的hashCode是不一样的)。








//演示Object类中的方法
class static void main(String[] args)
{
  String str = ”abc”;
  System.out.println(str.hashCode());
  //此时输出  64578
}






boolean equals(Object obj):拿当前对象(this)和参数obj做比较
//演示Object类中的方法
class static void main(String[] args)
{
  String str = ”abc”;
  String str1 =  ”abc”;


Object o1=new Object();


Object o2=new Object();


  System.out.println(str.equals(str1));
  //此时输出  相等, 表示两者相等


  System.out.println(o1.equals(o2));
  //此时输出  false, 表示两者不等,地址不相等
}



在Object中的equals方法,本身和 == 符号相等,都是比较对象的地址。
官方建议 每个类都应该覆盖equals方法,不要比较内存地址,而去比较我们实际关心的数据。  例如 两个学生对象,不管其他信息,只要学号相同 我们就认为 他们是同一个对象;两个字符串,只要内容想相同,我们就认为是同一个字符串。


String tostring()  返回该对象的字符串表示(当我们打印对象时,其实我们打印的就是tostring方法)。 即System.out.println(obj对象) 等价于 System.out.println(obj对象.tostring());
默认情况下,打印对象,打印的是对象的十六进制的hashcode值。但是我们更关心对象中存储的数据,官方建议 我们,应该每个类都应该覆盖toString,返回我们关心的数据。