zoukankan      html  css  js  c++  java
  • java基础系列(五):创建对象的那几种方式

    创建对象的5种方式:

    1. 最常用的通过new关键字,Object obj = new Object();
    2. 通过Class类的newInstance()方法,Student.class.newInstance()(已经不推荐使用了);
    3. 通过Constructor类的newInstance()方法,obj.class.getDeclaredConstructor()方法。调用构造器的方式有三种,new关键字,反射和反序列化,这里采用的是第二种方式。
    4. Clone()方法,分为深复制和浅复制,深复制复制对象及引用的对象,浅复制只复制引用,不复制引用的对象。
    5. 序列化,序列化就是将对象的状态转换为字节流,反序列化是将字节流生成相同状态的对象。序列化的作用:(1).网络上传输(2)实现数据的持久化

       这篇文章主要讲一下clone()方法的使用,下一篇再谈序列化。

    clone()方法

      clone()方法分为深复制和浅复制,区别在于复制引用还是复制引用的对象。此外,clone()是个native方法,前面的文章已经提到,并与相关方法做了比较。

    (1), 浅复制

    class Student implement Cloneable{
      public Integer id;
      public String name;
      public Grade grade;
      public Student(Integer id,String name,Grade grade){
        this.id = id;
        this.name = name;
        this.grade = grade;
      }
      @Override
      protected Student clone() throws CloneNotSupportedException {
      return (Student)super.clone();
      }
    }
    class Grade implement Cloneable{
      public String name;
      public Integer score;
      public Grade(String name,Integer score){
        this.name = name;
        this.score = score;
      }
      
      @Override
      protected Student clone() throws CloneNotSupportedException {
      return (Student)super.clone();
      }
    }

    (2)深复制

    class Student implement Cloneable{
      public Integer id;
      public String name;
      public Grade grade;
      public Student(Integer id,String name,Grade grade){
        this.id = id;
        this.name = name;
        this.grade = grade;
      } 
      @Override
      protected Student clone() throws CloneNotSupportedException {
        Student student = (Student)super.clone();
        student.grade = (Grade)grade.clone();
      
    return student;   } }

    使用clone方法的步骤:

      1)被克隆的类要实现Cloneable接口。

      2)被克隆的类要重写clone()方法。

      cloneable接口中没有任何的方法,它的作用只是用来只是可以使用Object的clone()方法进行合法的克隆,如果不实现接口直接调用就会CloneNotSupportedException。

    效率分析:

      clone()创建对象的方法要比new一个对象要快很多,因为clone是本地方法,直接对内存中的二进制流进行操作,特别是在创建一个大对象时,性能差别很大的。

  • 相关阅读:
    最小圆覆盖
    BZOJ3572 [Hnoi2014]世界树 【虚树 + 树形dp】
    一些组合数学
    BZOJ3611 [Heoi2014]大工程 【虚树】
    线段树合并
    BZOJ4446 [Scoi2015]小凸玩密室 【树形Dp】
    生成函数小记
    BZOJ2337 [HNOI2011]XOR和路径 【概率dp + 高斯消元】
    连续数字异或和
    POJ2976:Dropping tests——题解
  • 原文地址:https://www.cnblogs.com/amazing-eight/p/13258929.html
Copyright © 2011-2022 走看看