java基础-object类

Object

Object类

public class Object {
	...
	public final native Class<?> getClass();
	public native int hashCode();		//本地方法,这个类的存储地址
	public boolean equals(Object obj) {
        return (this == obj);
    }
	protected native Object clone() throws CloneNotSupportedException;	//本地clone方法
	public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
	public final native void notify();
	public final native void notifyAll();
	public final native void wait(long timeout) throws InterruptedException;
 	public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }
        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }
        if (nanos > 0) {
            timeout++;
        }
        wait(timeout);
    }
	protected void finalize() throws Throwable { }

equals和hashcode

hashcode调用本地方法,获取对象存储地址,equals比较两个对象的地址是否相同。
覆写equals()方法时,应该同时覆写hashCode()方法,反之亦然。

equals()方法需要具有如下特点:

  • 自反性(reflexive):任何非空引用x,x.equals(x)返回为true。
  • 对称性(symmetric):任何非空引用x和y,x.equals(y)返回true当且仅当y.equals(x)返回true。
  • 传递性(transitive):任何非空引用x和y,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)返回true。
  • 一致性(consistent):两个非空引用x和y,x.equals(y)的多次调用应该保持一致的结果,(前提条件是在多次比较之间没有修改x和y用于比较的相关信息)。
  • 约定:对于任何非空引用x,x.equals(null)应该返回为false。

hashCode的一般性契约(需要满足的条件)如下:

  • 在Java应用的一次执行过程中,如果对象用于equals比较的信息没有被修改,那么同一个对象多次调用hashCode()方法应该返回同一个整型值。
    应用的多次执行中,这个值不需要保持一致,即每次执行都是保持着各自不同的值。
  • 如果equals()判断两个对象相等,那么它们的hashCode()方法应该返回同样的值。
    并没有强制要求如果equals()判断两个对象不相等,那么它们的hashCode()方法就应该返回不同的值。两个对象用equals()方法比较返回false,它们的hashCode可以相同也可以不同。但是,应该意识到,为两个不相等的对象产生两个不同的hashCode可以改善哈希表的性能。

clone

  • 一定要调用Object的clone方法,它能够创建一个Object的对象,分配空间实现浅拷贝。
  • 使用这个方法的类必须实现java.lang.Cloneable接口,Cloneable接口只是一个标记,没有抽象方法,在Object.clone的方法中会判断类是否实现了Cloneable接口,如果没有实现会抛出CloneNotSupportedException异常。
  • Object.clone由protected修饰,实现类中需要改成public修饰。
  • 浅拷生成新对象,但是对象引用的内容与原对象一致,深拷贝产生新对象,对象引用的也是新的内容。

clone的过程:

  1. 在派生类中实现Cloneable借口。
  2. 为了获取对象的一份拷贝,我们可以利用Object类的clone方法。
  3. 在派生类中覆盖积累的clone方法,声明为public。
  4. 在派生类的clone方法中,调用super.clone()。
   public Object clone(){
        Object o=null;
        try {
            o=super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
   }

如下代码:

	Person person = new Person("zhangsna","12");
	Person newPerson = (Person)p.clone();
	System.out.println(newPerson);

输出的newPerson与person内容是一致的。由于是浅拷贝,修改newPerson的内容,person内容也会改变。

浅拷贝与深度拷贝:http://www.cnblogs.com/gw811/archive/2012/10/07/2712252.html

实现拷贝的过程

posted @ 2016-07-28 23:19  zhangshihai1232  阅读(124)  评论(0)    收藏  举报