对所用对象的通用方法 - toString(), clone()

知识点:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值