Java中常用API之Object(方法toString、equals、clone(浅克隆和深克隆(Gson))(及其细节))

在任意类的构造方法前有一个隐藏的访问父类的空参构造。

1.toString 

public class Test{
    public static void main(String[] args){
        Object obj=new Object();
        System.out.println(obj);
        System.out.println(obj.toString());
    }
}

 运行后发现控制台上两个输出语句打印出的结果是一样的,那是为什么呢?我们需要重新认识一下输出语句。

打印的本质是在调用对象toString方法

默认情况下,因为Object类中的toString方法返回的是地址值,但是地址值对于我们是没有意义的,我想要看到对象内部的属性值该怎么办?

我们前面说到,当父类中的方法满足不了子类时,子类可以进行方法重写,因为Java中所有的类直接或间接地继承于Object类,因此我们这里可以重写Object类中的toString方法。

 

                                                                     2.equals

public class Test{
    public static void main(String[] args){
        Student s1=new Student("张三",18);
        Student s2=new Student("李四",19);
        boolean result=s1.equals(s2);
        System.out.println(result);
    }
}







public class Student(
    private String name;
    private int age;
    
    public Student(){};

    public Student(){
        this.name=name;
        this.age=age;
    }

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name=name;
    }

    public int getAge(){
        return age;
    }

    public void setAge(int age){
        this.age=age;
    }

    @Override
    public boolean equals(Object o){
        if(this==o){
            return true;
        }
        if(o==null||getClass()!=o.getClass()){
            return false;
        }
        Student student=(Student)o;                  //向下强制类型转换
        return age==student.age&&Object.equals(name,student.name);
    }
)

 

                                                                    3.clone

public class Test{
    public static void main(String[] args) throws CloneNotSupportedException{
        Student s1=new Student("lisi",18);
        student s2=(Student)s1.clone();
        System.out.println(s1.getName()+s1.getAge());
        System.out.println(s2.getName+s2.getAge());
    }
}






public class Student implements Cloneable(
    private String name;
    private int age;
    
    public Student(){};

    public Student(){
        this.name=name;
        this.age=age;
    }

    public String getName(){
        return name;
    }

    public void setName(String name){
        this.name=name;
    }

    public int getAge(){
        return age;
    }

    public void setAge(int age){
        this.age=age;
    }

    @Override 
    protected Object clone() throws CloneNotSupportedException{
        return super.clone();
    }
}

 

 3.1浅克隆和深克隆

                                                                 3.1.1浅克隆

3.1.2深克隆

 

 我们知道深克隆对于基本数据类型是直接克隆,对于引用数据类型(除字符串)会在堆内存中重新创建一个区域,将新的地址赋给变量,而对于字符串类型,会先查看串池中是否有这样的字符串,如果有,那就复用(节省内存),如果没有,那就重新创建一个。

但是,Object类中的克隆默认是浅克隆,如果我们想要深克隆,应该怎么办?(我们可以重写Object类中的clone方法,在方法中创建一个新的数组,将其中的地址赋值给克隆出来的对象,达到地址值不一样,从而达到深克隆的目的)

 

 在这里我们可以用Google公司发布的一个开放源代码的Java库,Gson(又称Google Gson),可以实现深克隆

 2.8.0版本:百度云下载:百度网盘 请输入提取码  提取码:tn6j

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值