知识点:
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;
深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();
}
}
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();
}
}