Object类解析

来源:互联网 发布:观辰软件 编辑:程序博客网 时间:2024/05/06 02:19

       亲,你知道java中Object类中共有几个方法吗?是的一共有11个方法。如果不知道请你现在牢记 !

  • clone() // protected
  • finalize() // protected
  • eqauls(Object obj) //public
  • getClass() //public final
  • toString() //public
  • hashCode() //public
  • notify() //public final
  • notifyAll() //public final
  • wait() //public final
  • wait(long timeout) //public final
  • wati(long timeout, long nanio) //public final

       其中能够被重写的方法有5个:clone(), finalize(), hashCode(), equals(Object obj), toString(), 剩下的6个方法是不能被重写的,因这方法定定义成了final类型。虽然Object是所有类的超类,超类中被protected修饰符所修饰的成员变理和成员方法都可以被当前类、同一package、子类所引用,但是Object类中被protected所修饰的两个方法clone(), finalize()却不能直接被子类引用。

      clone()不能被直接调用的原因是:多数java开发者认为这是一个bug,clone不应该出现在object方法中,既然出现了却不能直接使用,非让类去实现一个没有一个方法的接口类java.lang.Cloneable,才能调用clone()方法。因为只有类实现了Cloneable接口后才能通过Overried clone方法后顺利的完成调用,否则即使Overried clone也会抛出CloneNotSupportedException 异常。所以为了避免出错,即使是Object的子类也是不能直接去调用clone方法的。

      finalize()不能被直接调用的原因是:在java设计中finalize是用来显式的进行垃圾回收,由垃圾回收器调用。java的垃圾回收都是自动回收的,虚拟机也不能保证在调用finalize()后便能顺利完成回收工作,所以这个方法是被垃圾回收器调用的,做为Object的子类没有必要直接就能调用,但是可以重写这个方法,在这个方法内部加上自己的逻辑。

      clone内容延伸:克隆分为深copy和浅copy。深copy是指变量里面的成员变量也指向一个对象,浅copy是指普通的java 8种基本类型及其对应的包装类变量。深copy很容易出现问题,例如一个对象变量里面引用了一个输入流,被深copy出另一个对象后,若源对象把输入流关闭了,那么深copy出来的对象也不能正常使用了。一般实现Cloneable接口,最好将protected修饰符改为public,否则本方法仅限于本类、同一package下、子类使用。

      equals(Object obj)内容延伸:在Object内中equals方法实现如下:

    public boolean equals(Object obj) {return (this == obj);    }

       `==`专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同。要比较两个基本类型或两个引用变量是否相等,只能用==操作符。

       equals方法是用来比较两个独立的对象内容是否相同。如果一个类没有自己Overrid equals方法,那么它就继承Object类的equals方法,代码如上。上面的代码使用了==操作符,那就是用来比较两个变量是否相同,即是否指向同一个对象,这时使用==和equals得到的是同样的结果,如果是比较两个独立的对象那些方法总返回false。

      getClass内容延伸:如果一个java bean A继承了一个java bean B,那么在类A中的toString方法如下:

   @Override   public String toString() {return super.getClass().getName() + "# ChineseBook [ahthor=" + ahthor + "]";   }

     那么再调用toString方法后结果会是怎么样呢?

      选项一: B# ChineseBook [ahthor=莫言]

     选项二:  A# ChineseBook [ahthor=莫言]
     你会选择哪种结果呢,答案是选项二。为什么是选项二呢?按理来讲使用super关键字,那就应该去调用父类啊,super.getClass()这样就得到类B了。其实不然,因为getClass()方法被定义成final类型了,就是说它不能被子类覆盖,getClass()方法是返回正在运行时对象,那么super.getClass()就相当于this.getClass()得到的还是当前类A,因为此时运行的类是A,结果就是选项二了。

     hashCode内容延伸:hashCode一般与equals一起使用,hashCode返回对象的哈希码,hashMap, hashSet就是使用hashCode来存储对象的集合。它们的实现方式是首先根据hashCode找到对应的存储区域,最后取出该存储区域内的每个元素与该对象进行equals方法比较。



0 0
原创粉丝点击