广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中clone方法使用笔记
  • 256
分享到

Java中clone方法使用笔记

Python 官方文档:入门教程 => 点击学习

摘要

目录注解注解的分类:内置注解元注解(修饰注解的注解)自定义注解对象克隆如何实现克隆总结注解 定义: 注解是一种注释机制,它可以注释包、类、方法、变量、参数,在编译器生成类文件时,标注

注解

定义: 注解是一种注释机制,它可以注释包、类、方法、变量、参数,在编译器生成类文件时,标注可以被嵌入到字节码中。

注解的分类:

内置注解

Override :重写方法,引用时没有该方法时会编译错误

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

Deprecated :标记过时方法,会造成编译警告

public class Animals {
    @Deprecated
    public void run(){
        System.out.println("动物跑");
    }
}

SuppressWarnings :用于编译器去忽略注解中的声明报告

FunctionalInterface :用于指示被修饰的接口是函数式接口

元注解(修饰注解的注解)

@Retention -标记这个注解存储在哪里

@Documented -标记这些注解是否包含在用户文档中

@Target -标记这些注解时java哪种成员

public enum ElementType {
    
    //可以应用于类的任何元素
    TYPE,
 
    //可以用于字段或属性
    
    FIELD,
 
    //可以用于方法级注释
    
    METHOD,
 
    //可以用于方法的参数
    
    PARAMETER,
 
    //可以应用于构造函数
    
    CONSTRUCTOR,
 
    //可以用于局部变量
    
    LOCAL_VARIABLE,
 
    
    ANNOTATION_TYPE,
 
    //可以用于包声明
    
    PACKAGE,
 
    
    TYPE_PARAMETER,
 
    
    TYPE_USE
}

@Inherited -标记这个注解时继承于哪个类

@Repeatable -标识某注解可以在同一个声明上使用多次

public enum RetentionPolicy {
    
    SOURCE,//在源文件中有效(源文件保存)
 
    
    CLASS,//在class文件中有效(class保存)
 
    
    RUNTIME//在运行时有效(运行时保留)
}

自定义注解

注解类:

@Target(ElementType.FIELD)//作用在类的属性上
@Retention(RetentionPolicy.RUNTIME)//运行时生效
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="长度不能小于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;
    }
 
}

测试代码:

public class Test {
 
      public static void main(String[] args) throws NoSuchMethodException, SecurityException, Exception {
            User user=new User();
          Field[] fields=user.getClass().getDeclaredFields();//将类中的字段存储在field数组中
          //对数组中的字段进行强循环
          for(Field filed:fields){
              NotNull notNull=filed.getAnnotation(NotNull.class);//获取注释类型
              if(notNull!=null){
    Method method = user.getClass().getMethod("get" + getMethodName(filed.getName()));//获取方法对象
           Object value = method.invoke(user);//调用类的实例对象
             if(value==null){
           System.err.println(filed.getName()+notNull.message());//打印输出相应的字段和注释信息
                      throw new NullPointerException(notNull.message());//抛出异常信息
                  }
                  else if(String.valueOf(value).length()< notNull.length()){//判断字符串长度
                      System.err.println(filed.getName()+notNull.lengthmessage());
 
                  }
              }
          }
 
       }
 
        
        private static String getMethodName(String fildeName) throws Exception {
            byte[] items = fildeName.getBytes();
            items[0] = (byte) ((char) items[0] - 'a' + 'A');
            return new String(items);
        }
}

对象克隆

原因:new出来的对象属性都是初始化的值,不能保存当前对象“状态”,clone解决了这个问题

//这种形式的代码复制的是引用,即对象在内存中的地址,car1和car2指向同一个对象
Car car1=new Car();
Car car2=car1;

如何实现克隆

克隆分为浅克隆和深克隆,下面就简单的介绍它们之前的区别:

  • 浅克隆(值类型克隆值,引用类型传递地址)

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();   //深度复制  联同person中关联的对象也一同克隆.
        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();
    }
}

测试类:

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);
    }
}

浅克隆中引用对象进行的是引用地址传递,原引用对象和克隆对象指向同一个引用地址

强克隆(值类型克隆值,引用类型克隆一个带有原数据的新的地址)

引用类:

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();   //深度复制  联同person中关联的对象也一同克隆.
        return person;
    }
 
    @Override
    public String toString() {
        return "Person{" +
                "num=" + num +
                ", name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}

测试:

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);
    }
}

强克隆中的引用类型新创建的地址赋给克隆对象引用类型

我们也可以通过序列化的方式对对象进行克隆,代码如下:

引用类:

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;
    }
 
    
    public Person myclone() {
            Person person = null;
              try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
                     ByteArrayOutputStream baos = new ByteArrayOutputStream();
                      ObjectOutputStream oos = new ObjectOutputStream(baos);
                      oos.writeObject(this);
            // 将流序列化成对象
                    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 +
                '}';
    }
}

测试类:

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);
 
 
    }
}

总结

到此这篇关于Java中clone方法使用的文章就介绍到这了,更多相关Java中clone方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中clone方法使用笔记

本文链接: https://www.lsjlt.com/news/195509.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中clone方法使用笔记
    目录注解注解的分类:内置注解元注解(修饰注解的注解)自定义注解对象克隆如何实现克隆总结注解 定义: 注解是一种注释机制,它可以注释包、类、方法、变量、参数,在编译器生成类文件时,标注...
    99+
    2023-02-10
    java中clone方法怎么用 Java clone方法 java中clone方法怎么用
  • Java中clone方法怎么使用
    在Java中,clone方法是Object类的一个原生方法,用于创建并返回对象的一个副本。要使用clone方法,需要满足以下两个条件...
    99+
    2023-08-17
    Java clone
  • Java中的clone方法怎么使用
    在Java中,`clone()`方法是用来创建对象的一个浅拷贝副本。要使用`clone()`方法,需要遵循以下步骤:1. 首先,在要...
    99+
    2023-09-15
    Java
  • java的clone方法怎么使用
    在Java中,clone方法是Object类的一个方法,用于创建并返回一个对象的副本。要使用clone方法,必须实现Cloneabl...
    99+
    2023-08-24
    java clone
  • java的clone方法有什么用
    Java中的clone方法用于创建一个对象的副本。当我们需要创建一个新对象,但又不想从头开始初始化它时,可以使用clone方法来复制...
    99+
    2023-09-25
    java
  • 如何解析Java中的clone方法
    如何解析Java中的clone方法,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java中对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,...
    99+
    2023-06-17
  • Java中的clone()和Cloneable接口使用方法是什么
    本篇内容介绍了“Java中的clone()和Cloneable接口使用方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!clone()...
    99+
    2023-06-25
  • 学习Java和Django的最好方法:使用IDE记录笔记!
    学习Java和Django的最好方法:使用IDE记录笔记! 对于很多程序员来说,学习一门新的编程语言或框架时,最常见的方法是通过阅读书籍或观看在线教程进行学习。然而,这种方法往往会导致大量的笔记和代码片段分散在各种不同的地方,难以管理和整理...
    99+
    2023-07-04
    django 学习笔记 ide
  • jquery中的clone()方法怎么用
    这篇文章主要介绍了jquery中的clone()方法怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 在jq...
    99+
    2022-10-19
  • php clone关键字的使用方法
    这篇文章主要介绍“php clone关键字的使用方法”,在日常操作中,相信很多人在php clone关键字的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php clone关键字的使用方法”的疑惑有所...
    99+
    2023-06-20
  • java中break标记的使用方法
    本篇内容介绍了“java中break标记的使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!break适用范围:只能用于switch或者...
    99+
    2023-06-03
  • Vue3使用JSX的方法实例(笔记自用)
    目录1. Vue3 中 JSX 的基本应用1.1 在 .vue 文件中使用 jsx1.2 .jsx文件格式2. JSX 和 template 的区别2.1 插值2.2 自定义组件2....
    99+
    2023-02-23
    vue3使用jsx组件 vue3使用jsx vue jsx
  • Java中的clone方法详解_动力节点Java学院整理
    Java中对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象...
    99+
    2023-05-31
    java clone 方法
  • 苹果笔记本电脑入门使用方法
    今天小编给大家分享一下苹果笔记本电脑入门使用方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先新机入手打开电脑,需要先设...
    99+
    2023-07-02
  • 浅析Java中clone()方法浅克隆与深度克隆
       现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生这个词语确实很“火”过一阵子,在Java中也有这么一个概念,它可以让我们很方便的“制造”出一个对象的副本来,下面来具体看看Java中的Clone机制是如何工...
    99+
    2023-05-31
    java clone 浅克隆
  • require.js使用方法的简单代码讲解笔记
    目录目的:基本API第一步:a.js定义第二步:引入这个模块加载文件页面需要加载多个js文件时,加载时浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长;由于js文件之间...
    99+
    2022-12-17
    require.js
  • clone()函数如何在java项目中使用
    clone()函数如何在java项目中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。clone就是复制, 在Java语言中, clone方法被对象调用,所以...
    99+
    2023-05-31
    java clone() ava
  • PHP中的魔术方法和学习笔记
    在PHP中,魔术方法(Magic Methods)是一组特殊的方法,它们以双下划线(__)作为前缀,用于在类中实现一些特殊的行为和功能。这些方法会在特定的情况下自动调用,而不需要我们显式地调用它们。在...
    99+
    2023-10-07
    php 学习 笔记
  • 笔记本电脑的基本使用方法有哪些
    这篇“笔记本电脑的基本使用方法有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“笔记本电脑的基本使用方法有哪些”文章吧。笔...
    99+
    2023-07-01
  • 学习Python的笔记中,如何记录路径和二维码的使用方法?
    Python是一种高级编程语言,它可以用于各种应用程序的开发,包括Web应用程序、桌面应用程序、网络服务器、图形用户界面等。在Python编程中,我们常常需要记录路径和二维码的使用方法。本文将介绍如何在学习Python的过程中,有效地记录...
    99+
    2023-08-29
    path 二维码 学习笔记
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作