最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中clone方法使用筆記

 更新時(shí)間:2023年02月10日 10:23:33   作者:吃橘子的Crow  
clone顧名思義是復(fù)制,在Java語言中,clone方法被對(duì)象調(diào)用,所以會(huì)復(fù)制對(duì)象,下面這篇文章主要給大家介紹了關(guān)于Java中clone方法使用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

注解

定義: 注解是一種注釋機(jī)制,它可以注釋包、類、方法、變量、參數(shù),在編譯器生成類文件時(shí),標(biāo)注可以被嵌入到字節(jié)碼中。

注解的分類:

內(nèi)置注解

Override :重寫方法,引用時(shí)沒有該方法時(shí)會(huì)編譯錯(cuò)誤

public class Animals {
    public void run(){
        System.out.println("動(dòng)物跑");
    }
}
public class Cat extends Animals{
    @Override
    public void run1() {
        super.run();
    }
}

Deprecated :標(biāo)記過時(shí)方法,會(huì)造成編譯警告

public class Animals {
    @Deprecated
    public void run(){
        System.out.println("動(dòng)物跑");
    }
}

SuppressWarnings :用于編譯器去忽略注解中的聲明報(bào)告

FunctionalInterface :用于指示被修飾的接口是函數(shù)式接口

元注解(修飾注解的注解)

@Retention -標(biāo)記這個(gè)注解存儲(chǔ)在哪里

@Documented -標(biāo)記這些注解是否包含在用戶文檔中

@Target -標(biāo)記這些注解時(shí)java哪種成員

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    //可以應(yīng)用于類的任何元素
    TYPE,
 
    //可以用于字段或?qū)傩?
    /** Field declaration (includes enum constants) */
    FIELD,
 
    //可以用于方法級(jí)注釋
    /** Method declaration */
    METHOD,
 
    //可以用于方法的參數(shù)
    /** Formal parameter declaration */
    PARAMETER,
 
    //可以應(yīng)用于構(gòu)造函數(shù)
    /** Constructor declaration */
    CONSTRUCTOR,
 
    //可以用于局部變量
    /** Local variable declaration */
    LOCAL_VARIABLE,
 
    /** Annotation type declaration */
    ANNOTATION_TYPE,
 
    //可以用于包聲明
    /** Package declaration */
    PACKAGE,
 
    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,
 
    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE
}

@Inherited -標(biāo)記這個(gè)注解時(shí)繼承于哪個(gè)類

@Repeatable -標(biāo)識(shí)某注解可以在同一個(gè)聲明上使用多次

public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,//在源文件中有效(源文件保存)
 
    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,//在class文件中有效(class保存)
 
    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME//在運(yùn)行時(shí)有效(運(yùn)行時(shí)保留)
}

自定義注解

注解類:

@Target(ElementType.FIELD)//作用在類的屬性上
@Retention(RetentionPolicy.RUNTIME)//運(yùn)行時(shí)生效
public @interface NotNull {
 
    String message() default "";
    
    int length() default 0;
    
    String lengthmessage() default "";
}

model類:

public class User {
    
    private int num;
 
    @NotNull(message="姓名不能為空",length=3,lengthmessage="長(zhǎng)度不能小于3")
    private String name;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getNum() {
        return num;
    }
 
    public void setNum(int num) {
        this.num = num;
    }
 
}

測(cè)試代碼:

public class Test {
 
      public static void main(String[] args) throws NoSuchMethodException, SecurityException, Exception {
            User user=new User();
          Field[] fields=user.getClass().getDeclaredFields();//將類中的字段存儲(chǔ)在field數(shù)組中
          //對(duì)數(shù)組中的字段進(jìn)行強(qiáng)循環(huán)
          for(Field filed:fields){
              NotNull notNull=filed.getAnnotation(NotNull.class);//獲取注釋類型
              if(notNull!=null){
    Method method = user.getClass().getMethod("get" + getMethodName(filed.getName()));//獲取方法對(duì)象
           Object value = method.invoke(user);//調(diào)用類的實(shí)例對(duì)象
             if(value==null){
           System.err.println(filed.getName()+notNull.message());//打印輸出相應(yīng)的字段和注釋信息
                      throw new NullPointerException(notNull.message());//拋出異常信息
                  }
                  else if(String.valueOf(value).length()< notNull.length()){//判斷字符串長(zhǎng)度
                      System.err.println(filed.getName()+notNull.lengthmessage());
 
                  }
              }
          }
 
       }
 
        /**
         * 把一個(gè)字符串的第一個(gè)字母大寫
         */
        private static String getMethodName(String fildeName) throws Exception {
            byte[] items = fildeName.getBytes();
            items[0] = (byte) ((char) items[0] - 'a' + 'A');
            return new String(items);
        }
}

對(duì)象克隆

原因:new出來的對(duì)象屬性都是初始化的值,不能保存當(dāng)前對(duì)象“狀態(tài)”,clone解決了這個(gè)問題

//這種形式的代碼復(fù)制的是引用,即對(duì)象在內(nèi)存中的地址,car1和car2指向同一個(gè)對(duì)象
Car car1=new Car();
Car car2=car1;

如何實(shí)現(xiàn)克隆

克隆分為淺克隆和深克隆,下面就簡(jiǎn)單的介紹它們之前的區(qū)別:

  • 淺克?。ㄖ殿愋涂寺≈担妙愋蛡鬟f地址)

model類:

public class Person implements  Cloneable{
 
     int num;
     String name;
     Address address;
 
    public Person() {
    }
 
    public Person(int num, String name) {
        this.num = num;
        this.name = name;
    }
 
    public int getNum() {
        return num;
    }
 
    public void setNum(int num) {
        this.num = num;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Address getAddress() {
        return address;
    }
 
    public void setAddress(Address address) {
        this.address = address;
    }
 
    @Override
    protected Person clone() throws CloneNotSupportedException {
        Person person = (Person)super.clone();
       // person.address = (Address)address.clone();   //深度復(fù)制  聯(lián)同person中關(guān)聯(lián)的對(duì)象也一同克隆.
        return person;
    }
    @Override
    public String toString() {
        return "Person{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}

引用類:

public class Address {
 
     String  address;
 
    public String getAddress() {
        return address;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
 
    @Override
    public String toString() {
        return "Address{" +
                "address='" + address + '\'' +
                '}';
    }
 
    @Override
    protected Address clone() throws CloneNotSupportedException {
        return (Address)super.clone();
    }
}

測(cè)試類:

public class Test {
 
    public static void main(String[] args) throws CloneNotSupportedException {
 
        Address address = new Address();
                address.setAddress("漢中");
 
        Person p1 = new  Person(100,"jim");
               p1.setAddress(address);
 
        Person p2 =p1.clone();
               p2.setName("tom");
               address.setAddress("西安");//
        System.out.println(p1);
    }
}

淺克隆中引用對(duì)象進(jìn)行的是引用地址傳遞,原引用對(duì)象和克隆對(duì)象指向同一個(gè)引用地址

強(qiáng)克隆(值類型克隆值,引用類型克隆一個(gè)帶有原數(shù)據(jù)的新的地址)

引用類:

public class Address implements Cloneable{
 
     String  address;
 
    public String getAddress() {
        return address;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
 
    @Override
    public String toString() {
        return "Address{" +
                "address='" + address + '\'' +
                '}';
    }
 
    @Override
    protected Address clone() throws CloneNotSupportedException {
        return (Address)super.clone();
    }
}

model類:

public class Person implements  Cloneable{
 
     int num;
     String name;
     Address address;
 
    public Person() {
    }
 
    public Person(int num, String name) {
        this.num = num;
        this.name = name;
    }
 
    public int getNum() {
        return num;
    }
 
    public void setNum(int num) {
        this.num = num;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Address getAddress() {
        return address;
    }
 
    public void setAddress(Address address) {
        this.address = address;
    }
 
    @Override
    protected Person clone() throws CloneNotSupportedException {
        Person person = (Person)super.clone();
        person.address = (Address)address.clone();   //深度復(fù)制  聯(lián)同person中關(guān)聯(lián)的對(duì)象也一同克隆.
        return person;
    }
 
    @Override
    public String toString() {
        return "Person{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}

測(cè)試:

public class Test {
 
    public static void main(String[] args) throws CloneNotSupportedException {
 
        Address address = new Address();
                address.setAddress("漢中");
 
        Person p1 = new  Person(100,"jim");
               p1.setAddress(address);
 
        Person p2 =p1.clone();
               p2.setName("tom");
               address.setAddress("西安");
        System.out.println(p1);
        System.out.println(p2);
    }
}

強(qiáng)克隆中的引用類型新創(chuàng)建的地址賦給克隆對(duì)象引用類型

我們也可以通過序列化的方式對(duì)對(duì)象進(jìn)行克隆,代碼如下:

引用類:

public class Address  implements Serializable {
 
     String  address;
 
    public String getAddress() {
        return address;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
 
    @Override
    public String toString() {
        return "Address{" +
                "address='" + address + '\'' +
                '}';
    }
 
}

model類:

 
public class Person implements Serializable {
 
     int num;
     String name;
     Address address;
 
    public Person() {
    }
 
    public Person(int num, String name) {
        this.num = num;
        this.name = name;
    }
 
    public int getNum() {
        return num;
    }
 
    public void setNum(int num) {
        this.num = num;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Address getAddress() {
        return address;
    }
 
    public void setAddress(Address address) {
        this.address = address;
    }
 
    /**
     * 自定義克隆方法
     * @return
     */
    public Person myclone() {
            Person person = null;
              try { // 將該對(duì)象序列化成流,因?yàn)閷懺诹骼锏氖菍?duì)象的一個(gè)拷貝,而原對(duì)象仍然存在于JVM里面。所以利用這個(gè)特性可以實(shí)現(xiàn)對(duì)象的深拷貝
                     ByteArrayOutputStream baos = new ByteArrayOutputStream();
                      ObjectOutputStream oos = new ObjectOutputStream(baos);
                      oos.writeObject(this);
            // 將流序列化成對(duì)象
                    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
                     ObjectInputStream ois = new ObjectInputStream(bais);
                     person = (Person) ois.readObject();
                  } catch (IOException e) {
                     e.printStackTrace();
                  } catch (ClassNotFoundException e) {
                     e.printStackTrace();
                 }
             return person;
          }
 
 
    @Override
    public String toString() {
        return "Person{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}

測(cè)試類:

public class Test {
 
    public static void main(String[] args) throws CloneNotSupportedException {
 
        Address address = new Address();
                address.setAddress("漢中");
 
        Person p1 = new  Person(100,"jim");
        p1.setAddress(address);
 
        Person p2 =p1.myclone();
               p2.setName("tom");
               address.setAddress("西安");
 
        System.out.println(p1);
        System.out.println(p2);
 
 
    }
}

總結(jié)

到此這篇關(guān)于Java中clone方法使用的文章就介紹到這了,更多相關(guān)Java中clone方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java自定義動(dòng)態(tài)鏈接數(shù)據(jù)庫示例

    java自定義動(dòng)態(tài)鏈接數(shù)據(jù)庫示例

    這篇文章主要介紹了java自定義動(dòng)態(tài)鏈接數(shù)據(jù)庫示例,需要的朋友可以參考下
    2014-02-02
  • Spring Boot自動(dòng)注入的原理分析

    Spring Boot自動(dòng)注入的原理分析

    這篇文章主要給大家分析介紹了關(guān)于Spring Boot自動(dòng)注入的原理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring Boot自具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • IDEA性能優(yōu)化方法解決卡頓問題

    IDEA性能優(yōu)化方法解決卡頓問題

    本文主要介紹了如何在不升級(jí)電腦配置的情況下通過修改IntelliJIDEA的設(shè)置來優(yōu)化其性能,從而提升開發(fā)效率
    2024-12-12
  • 使用Spring Cache和Redis實(shí)現(xiàn)查詢數(shù)據(jù)緩存

    使用Spring Cache和Redis實(shí)現(xiàn)查詢數(shù)據(jù)緩存

    在現(xiàn)代應(yīng)用程序中,查詢緩存的使用已經(jīng)變得越來越普遍,它不僅能夠顯著提高系統(tǒng)的性能,還能提升用戶體驗(yàn),在這篇文章中,我們將探討緩存的基本概念、重要性以及如何使用Spring Cache和Redis實(shí)現(xiàn)查詢數(shù)據(jù)緩存,需要的朋友可以參考下
    2024-07-07
  • Java迭代器遍歷list的方法及代碼分析

    Java迭代器遍歷list的方法及代碼分析

    在本篇內(nèi)容里系小編給大家分享的是一篇關(guān)于Java迭代器遍歷list的方法總結(jié)內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。
    2022-11-11
  • java.lang.String和java.util.NClob互相轉(zhuǎn)換方式

    java.lang.String和java.util.NClob互相轉(zhuǎn)換方式

    這篇文章主要介紹了java.lang.String和java.util.NClob互相轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java多線程通訊之wait,notify的區(qū)別詳解

    Java多線程通訊之wait,notify的區(qū)別詳解

    這篇文章主要介紹了Java多線程通訊之wait,notify的區(qū)別詳解,非常不錯(cuò),具有一定的參考借鑒借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • Java中的HashMap源碼分析

    Java中的HashMap源碼分析

    這篇文章主要介紹了Java中的HashMap源碼分析,散列表是根據(jù)關(guān)鍵碼值(Key?value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu),也就是說,它通過把關(guān)鍵碼值映射到表中一個(gè)位置來訪問記錄,以加快查找的速度,這個(gè)映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做散列表,需要的朋友可以參考下
    2023-09-09
  • Mybatis批量插入Oracle數(shù)據(jù)的方法實(shí)例

    Mybatis批量插入Oracle數(shù)據(jù)的方法實(shí)例

    在開發(fā)中或多或少都會(huì)遇到數(shù)據(jù)批量插入的功能,最近我在做項(xiàng)目的過程中就遇到了這樣一個(gè)問題,下面這篇文章主要給大家介紹了關(guān)于Mybatis批量插入Oracle數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 一篇看懂Java中的Unsafe類

    一篇看懂Java中的Unsafe類

    在閱讀AtomicInteger的源碼時(shí),看到了這個(gè)類:sum.msic.Unsafe,之前從沒見過。所以花了點(diǎn)時(shí)間研究了下,下面這篇文章主要給大家介紹了關(guān)于Java中Unsafe類的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05

最新評(píng)論

博野县| 奎屯市| 延吉市| 弥渡县| 承德县| 晋宁县| 东源县| 乌审旗| 伊宁市| 绥阳县| 漯河市| 木兰县| 曲阜市| 渝中区| 德格县| 清镇市| 平潭县| 郎溪县| 格尔木市| 东光县| 宝鸡市| 湘潭市| 望都县| 钦州市| 西平县| 全南县| 磐石市| 墨竹工卡县| 马公市| 凤台县| 西乌珠穆沁旗| 乌鲁木齐市| 方城县| 新巴尔虎右旗| 双江| 尼玛县| 安仁县| 庆阳市| 新津县| 阿勒泰市| 永泰县|