java.lang.object类中的几个方法(1)

来源:互联网 发布:2016淘宝卖家处罚规则 编辑:程序博客网 时间:2024/06/07 18:09

java.lang.object类中有几个方法不是final的,我们会经常用重写它们,
protected  Object clone() 创建并返回此对象的一个副本。
boolean equals(Object obj) 指示某个其他对象是否与此对象“相等”。
protected  void finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
int hashCode() 返回该对象的哈希码值。
String toString() 返回该对象的字符串表示。

1、clone()
我们为什么要用clone()?
当我们需要一个与某个对像时一模一样的对像时,但它们又是相互独立的,对它们各自的操作不会影响到另外的一个,这时候用clone()就可以
实现,当然,其他的方法也可以实现,但是重写clone()简单,高效
有一个不没重写clone()的例子,能帮助我们更好的去理解clone(),如下:
public class Test
{
 public static void main(String[] args){
  A a1=new A();
  A a2=new A();
  a1.name="a1";
  a2=a1;
  a2.name="a2";
  System.out.println("a1.name="+a1.name);
  System.out.println("a2.name="+a2.name);
  
  
 }
 
}

class A
{
 public String name;
 
}
输出结果为:a1.name=a2;
a2.name=a2;
下面这个是重写了clone()的例子
public class Test
{
 public static void main(String[] args) throws CloneNotSupportedException {
  A a1=new A();
  A a2=new A();
  a1.name="a1";
  a2=(A) a1.clone();
  a2.name="a2";
  System.out.println("a1.name="+a1.name);
  System.out.println("a2.name="+a2.name);
  
  
 }
 
}

class A implements Cloneable
{
 public String name;
 
 @Override
 protected Object clone() throws CloneNotSupportedException {
  return super.clone();
 }

以上的是一个浅克隆,还有深克隆,引用API上的一段话是:“按照惯例,此方法返回的对象应该独立于该对象(正被克隆的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被克隆对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。如果一个类只包含基本字段或对不变对象的引用,那么通常不需要修改 super.clone 返回的对象中的字段。

Object 类的 clone 方法执行特定的克隆操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意:所有的数组都被视为实现接口 Cloneable。否则,此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;这些字段的内容没有被自我克隆。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。
”。

对于提到的可变对像和不可变对像,在下面的例子中,User类中的属性只有name(String类型,为不可变对像),age(基本数据类型),
而在Account类中属性有user(User的对像,为可变对像),balance,在重写clone()方法时,可有代码看出他们的区别
1.class User implements Cloneable {  
2.    String name;  
3.    int age;  
4. 
5.    @Override 
6.    public User clone() throws CloneNotSupportedException {  
7.        return (User) super.clone();  
8.    }  
9.}  
10. 
11.class Account implements Cloneable {  
12.    User user;  
13.    long balance;  
14. 
15.    @Override 
16.    public Account clone() throws CloneNotSupportedException {  
17.        Account account = null;  
18. 
19.        account = (Account) super.clone();  
20.        if (user != null) {  
21.            account.user = user.clone();  
22.        }  
23. 
24.        return account;  
25.    }  
26.} 

原创粉丝点击