Object+克隆的第三方工具

 

 

 

 

 

  

package com.mao.one;

public class ObjectDemo01 {
    public static void main(String[] args) {

        //1.toString
        Object obj = new Object();
        String str1 = obj.toString();
        System.out.println(str1);

        Student student = new Student();
        String str2 = student.toString();
        System.out.println(str2);
        //细节:
        //System:类名
        //out:静态变量
        //System。out:获取打印对象
        //println():方法
        //参数:表示打印的内容
        //核心逻辑
        //当我们打印一个对象时,底层会调用对象的toString方法,把对象变成字符串
        //然后 打印在控制台上 打印完后进行换行处理
        System.out.println(student);
    }
}

 

package com.mao.one;

public class ObjectDemo02 {
    public static void main(String[] args) {
        //2.equals

        Student s1 = new Student("zhangsan",23);
        Student s2 = new Student("zhangsan",23);

        boolean result = s1.equals(s2);
        System.out.println(result);

        //1.如果没有重写equals方法,那么 默认使用Object中的方法进行比较,比较的是地址值是否相等
        //2.一般来讲地址值对于我们意义不大,所以我们会重写,重写之后比较的是对象内部的属性值了

        //练习:大厂面试题
        String s  = "abc";
        StringBuilder sb =new StringBuilder("abc");

        System.out.println(s.equals(sb));//false
        //因为equalse方法是被s调用,s是字符串
        //所以equals要看的是String中的equals
        //字符串中的equals方法,先判断参数是否是字符串
        //如果是字符串,在比较内部属性
        //如果不是字符串,直接返回false
        System.out.println(sb.equals(s));//false
        //因为equalse方法是被sb调用,sb是StringBuilder
        //所以equals要看的是StringBuilder中的equals
        //StringBuilder中没有重写equals方法,使用的是Object中的
        //在Object中默认使用的是==来比较两个对象的地址值
        //而s和sb记录的地址值是不一样的,所有结果返回false
    }
}

 对象克隆:

 

 


package com.mao.one;

import java.util.StringJoiner;
//Cloneable
//如果一个接口中没有抽象方法
//表示当前的接口是一个标记性的接口
//现在Cloneable表示一旦实现,那么当前类的对象就可以被克隆
//如果没实现,当前类的对象就不能被克隆
public class User implements Cloneable{
private int id;
private String username;
private String password;
private String path;
private int[] data;

public User() {
}

public User(int id, String username, String password, String path, int[] data) {
this.id = id;
this.username = username;
this.password = password;
this.path = path;
this.data = data;
}

/**
* 获取
* @return id
*/
public int getId() {
return id;
}

/**
* 设置
* @param id
*/
public void setId(int id) {
this.id = id;
}

/**
* 获取
* @return username
*/
public String getUsername() {
return username;
}

/**
* 设置
* @param username
*/
public void setUsername(String username) {
this.username = username;
}

/**
* 获取
* @return password
*/
public String getPassword() {
return password;
}

/**
* 设置
* @param password
*/
public void setPassword(String password) {
this.password = password;
}

/**
* 获取
* @return path
*/
public String getPath() {
return path;
}

/**
* 设置
* @param path
*/
public void setPath(String path) {
this.path = path;
}

/**
* 获取
* @return data
*/
public int[] getData() {
return data;
}

/**
* 设置
* @param data
*/
public void setData(int[] data) {
this.data = data;
}

public String toString() {

return "User{id = " + id + ", username = " + username + ", password = " + password + ", path = " + path + ", data = " + arrToString()+ "}";
}
public String arrToString(){
StringJoiner sj = new StringJoiner(",","[","]");
for (int i = 0; i < data.length; i++) {
sj.add(data[i]+" ");
}
return sj.toString();
}

@Override
protected Object clone() throws CloneNotSupportedException {
//调用父类中的clone方法
//相当于让java帮我克隆一个对象,并把克隆的对象返回
return super.clone();
}
}
public String toString() { return "User{id = " + id + ", username = " + username + ", password = " + password + ", path = " + path + ", data = " + arrToString()+ "}"; } public String arrToString(){ StringJoiner sj = new StringJoiner(",","[","]"); for (int i = 0; i < data.length; i++) { sj.add(data[i]+" "); } return sj.toString(); } }

 

package com.mao.one;

public class ObjectDemo03 {
    public static void main(String[] args) throws CloneNotSupportedException {
        //clone

        //1.创建一个对象
        int[] data = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
        User u1 = new User(1,"zhangsan","1234","gril",data);

        //2.克隆对象
        //1.方法在底层会帮我们创界一个数据,并把原对象中的数据拷贝过去
        //2.重写Object中的clone方法
        //要让Javabean 去实现 Cloneable  接口
        //3.创建原对象,并调用clone方法
        User u2  = (User) u1.clone();

        System.out.println(u1);
        System.out.println(u2);
    }
}

 

 

 

 

 

 

 

package com.mao.one;

import com.google.gson.Gson;

public class ObjectDemo03 {
    public static void main(String[] args) throws CloneNotSupportedException {
        //clone

        //1.创建一个对象
        int[] data = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
        User u1 = new User(1,"zhangsan","1234","gril",data);

        //2.克隆对象
        //1.方法在底层会帮我们创界一个数据,并把原对象中的数据拷贝过去
        //2.重写Object中的clone方法
        //要让Javabean 去实现 Cloneable  接口
        //3.创建原对象,并调用clone方法
        User u2  = (User) u1.clone();

        //验证一件事:Object中的克隆是浅克隆 正确
        int[] arr = u1.getData();
        arr[0] = 100;

        System.out.println(u1);
        System.out.println(u2);

        //第三方的工具
        //1.第三方写的代码导入到项目中
        //2。编写代码
        Gson gson = new Gson();
        //把对象变成字符串
        String s = gson.toJson(u1);
        //再把字符串变回对象
        User user = gson.fromJson(s, User.class);
        System.out.println(user);
    }
}

 

 

 

 

 

package com.mao.one;

import java.util.Objects;

public class ObjectsDemo01 {
    public static void main(String[] args) {
        Student s1 = null;
        Student s2 = new Student("zhangsan ",23);

        boolean result = Objects.equals(s1, s2);
        System.out.println(result);
        //1.方法的底层会判断s1是否为null,如果是null  ,直接返回false
        //2.如果s1不为null,那么就利用s1再次调用equals方法
        //3.此时s1是Student,所以最终还是会调用Student中的equals方法
        //如果没有重写,比较地址值  ,如果重写了 ,比较属性值

        Student s3 =  new Student();
        Student s4 = null;//true
        System.out.println(Objects.isNull(s3));//false
        System.out.println(Objects.isNull(s4));//true

        System.out.println(Objects.nonNull(s3));//false
        System.out.println(Objects.nonNull(s4));//true


    }
}

 

posted @ 2022-08-17 07:10  是貓阿啊  阅读(50)  评论(0)    收藏  举报