java.lang.Object是所有java类的超类,在定义的类中并没有显示的加上extends Object,它是由JVM启动的时候自动实现的,其方法如下图所示:

 我们经常会判断两个对象之间是否相等;我们有时也需要获得一个对象的副本;对象在实例化后,存放在堆内存中,可以通过getClass()获得对象对应类的引用地址; 对象被存放在主内存(堆中),在多个线程共用主内存的时候会先获得对象锁,然后线程可以等待,进入阻塞状态,只有等待超时、中断或者被其他线程唤醒,该等待线程才会进入运行状态;JVM是进行内存自动管理的,当满足垃圾回收条件的时候,JVM会调用每个对象的finalize()方法进行垃圾回收,释放内存。

【对象相等判断】

判断一个对象相等,有使用equals和==,通常判断一个对象相等,我们使用equals,它主要是判断两个对象的属性是不是相等的,==判断两个数值或对象的引用地址是不是一样的。我们在创建对象的时候,一般要重写equals和hashCode方法,如果不重写equals方法,其比较则和==是一致的,如果不重写hashCode方法,则将对象放到集合如HashTable、HashMap或者HashSet的时候可能会出错。如果两个对象相等,则其hashCode也一定相等,如果两个对象的hashCode不相等,两个对象一定不相等,如果两个对象的hashCode相等,则两个对象不一定相等。

【克隆对象】

Object类中有clone方法,其对应的子类不能直接使用clone()方法,必须实现Cloneable接口才可以使用clone()方法,Cloneable接口里面没有任何的方法,只作功能性标记使用。Object自带的native clone方法,只能做浅拷贝(只复制对象的基本类型,对象类型,仍属于原来的引用)。不能做深度拷贝(不紧复制对象的基本类,同时也复制原对象中的对象,完全产生新对象)。主要表现为被克隆对象内部,如果还有对象或集合的引用,则新克隆出来的对象中对这些属性对象或集合的引用是不变的,如果有使用到深度clone的话,则需要重写clone方法作进一步的操作。

(1)默认的浅度克隆

 1 /**
 2  * 功能描述:验证对象的clone
 3  * @author ckx
 4  * @date 2016年11月17日
 5  */
 6 public class ValidateClone implements Cloneable{
 7     public String name;
 8     public String address;
 9     public List<?> list;
10     public static void main(String[] args) {
11         ValidateClone vc=new ValidateClone();
12         vc.setAddress("北京");
13         vc.setName("小明");
14         List<String> listT=new ArrayList<String>();
15         listT.add("String Type");
16         vc.setList(listT);
17         try {
18             ValidateClone vcNew=(ValidateClone)vc.clone();
19             System.out.println("vcNew.getAddress:"+vcNew.getAddress());
20             System.out.println("vcNew.getName:"+vcNew.getName());
21             System.out.println("vcNew.getList.size:"+vcNew.getList().size());
22             System.out.println("vcNew.equals(vc):"+vcNew.equals(vc));
23             System.out.println("vcNew.list.equals(vc.list):"+vcNew.list.equals(vc.list));
24         } catch (CloneNotSupportedException e) {
25             e.printStackTrace();
26         }
27     }
28     public String getName() {
29         return name;
30     }
31     public void setName(String name) {
32         this.name = name;
33     }
34     public String getAddress() {
35         return address;
36     }
37     public void setAddress(String address) {
38         this.address = address;
39     }
40     public List<?> getList() {
41         return list;
42     }
43     
44     public void setList(List<?> list) {
45         this.list = list;
46     }
47 }

其输出结果如下:

vcNew.getAddress:北京
vcNew.getName:小明
vcNew.getList.size:1
vcNew.equals(vc):false
vcNew.list.equals(vc.list):true

 (2)深度克隆,需要根据实际情况,将引用的对象进行重新new对象出来,再进行相应的设置对应属性操作,直到最后一层的引用为基本数据类型为止。

获得类引用的作用

多线程里面wait、notify的作用

垃圾回收finalize的运用

参考文档:

Java总结篇系列:java.lang.Object

Java Collections - hashCode() and equals()

 

posted on 2016-11-16 16:41  天狼群星  阅读(258)  评论(0)    收藏  举报