作者:酸辣汤

链接:https://juejin.cn/post/6844903905323646990

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一、使用new关键字

如 User user=new User();

执行这条语句,jvm做了什么?

  1. 首先在方法区的常量池中查看是否有new 后面参数(也就是类名)的符号引用,并检查是否有类的加载信息也就是是否被加载解析和初始化过。如果已经加载过了就不在加载,否则执行类的加载全过程
  2. 加载完类后,大致做了如下三件事: a、给实例分配内存 b、调用构造函数,初始化成员字段 c、user对象指向分配的内存空间 注意:new操作不是原子操作,b和c的顺序可能会调换

二、使用clone方法

当我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。因为Object 类的 clone 方法的 原理是从内存中(堆内存)以二进制流的方式进行拷贝,重新分配一个内存块,那构造函数没有被执行也是非常正常的了.

使用clone方法创建对象的实例:

public class CloneTest implements Cloneable{
    private String name;
    private int 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;
    }

    public CloneTest(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        try {
            CloneTest cloneTest = new CloneTest("酸辣汤",18);//todo
            CloneTest copyClone = (CloneTest) cloneTest.clone();
            System.out.println("newclone:"+cloneTest.getName());
            System.out.println("copyClone:"+copyClone.getName());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }

}

输出:

newclone:酸辣汤

copyClone:酸辣汤

注意:
1.clone是Object中的方法,Cloneable是一个标识接口,它表明这个类的对象是可以拷贝的。如果没有实现Cloneable接口却调用了clone()函数将抛出异常

2.Object.clone()未做同步处理,线程不安全

3.clone()有深拷贝和浅拷贝两种方式

三、使用反序列化

序列化是干什么的?

简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自 己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。一句话概括:序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。

java中要序列化的类必要实现Serializable接口

什么情况下需要序列化

a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

b)当你想用套接字在网络上传送对象的时候;