对所用对象的通用方法

来源:互联网 发布:linux 改名字命令 编辑:程序博客网 时间:2024/05/17 02:10

知识点:

1.建议所有子类都覆盖toString()方法。

2.Object, Integer, String的toString()方法。

3.怎么实现clone方法。

4.深clone和浅clone。

5.拷贝构造器代替clone。


1.建议所有子类都覆盖toString()方法。

覆盖toString()方法的好处就是,我们可以从toString()方法中很方便知道对象的信息。


2.Object, Integer, String的toString()方法。

看下面代码,Object的toString()方法返回类名加内存中地址,Integer的toString()方法,是把自己转换为十进制然后再转为String类型,String的toString()方法就是返回自己。

    Object的toString()方法    public String toString() {        return getClass().getName() + "@" + Integer.toHexString(hashCode());    }    Integer的toString方法    public String toString() {        return toString(value);    }    public static String toString(int i) {        if (i == Integer.MIN_VALUE)            return "-2147483648";        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);        char[] buf = new char[size];        getChars(i, size, buf);        return new String(buf, true);    }    String的toString方法    public String toString() {        return this;    }

3.怎么实现clone方法。

先看一下Object类的clone方法,是一个本地方法,并且是protected的。如果你的类想要调用clone方法,你必须做到以下几点:

a.实现Cloneable接口

b.用一个公有类覆盖Object的Clone方法。这个方法应该先调用super.clone方法,然后更改需要更改的变量。

protected native Object clone() throws CloneNotSupportedException;


4.深clone和浅clone。

深clone:复制对象和引用,浅clone:只复制引用。Object的clone方法是浅clone.举个简单的例子,看下面代码,类A的对象调用重写的clone方法可以拷贝基本类型a,对于引用类型的b, 只能拷贝其引用。

class A {   int a;   B b;    @Override      public A clone() throws CloneNotSupportedException {         return (A)super.clone();      }  }


如果想要连b的引用和对象一起copy,则需要改变为下面代码,那样b也要以同样的方式实现clone接口。如果b的对象也有引用对象,会越来越麻烦。所以copy 在我们平时工作中很少用到,我们一般用拷贝构造器,或者或者一个方法或者静态工厂来Copy一个对象。

public A clone() throws CloneNotSupportedException {          A a = (A)super.clone();          a.b = b.clone();        return A;      }

5.拷贝构造器代替clone。

除了用clone来构造对象,我们最常用的使用构造器来构造对象。比如上面的类A, 我们想要拷贝,可以用下面代码, 拷贝构造器不用强制对象实现clone接口。

class A {   int a;   B b;    public A(A) {A copyA = new A();copyA.a = A.a;        copyB.b = new B(b);return A;    }    @Override      public A clone() throws CloneNotSupportedException {         return (A)super.clone();      }  }



阅读全文
0 0
原创粉丝点击