当前位置: 首页 > news >正文

Java进阶--注解与克隆

Java注解

概念

        Java注解,又称Java标注,JDK5.0引入。

        可以加在包,类,变量,方法上,可以通过发射机制获取到标注的内容。

        可以随着代码进行编译,嵌入字节码;

        运行时可以获取到,可以对程序进行一些标注作用。

分类

内置注解

Java中已有的注解,由Java提供,已经定义好的。

//重写注解
@Override 
//注解已过时方法
@Deprecated
//用于忽略注解中的警告
@SuppressWarnings
//用于被修饰的接口是函数式接口
@Functionalnterface

元注解

        由JavaApi提供,用于修饰注解的注释,通常用在注解的定义上。

//标识这个注解怎么保存
@Retention
//标记这个注解是否包含在用户文档中
@Documented
//标记这个注解的应用范围
@Target
// 标记这个注解是继承与那个注解类
@Inherited
// 标识某个注解可以在某个声明上使用多次
@Repetable
@Target
ElementType.TYPE            //可以应用于类的任何元素。
ElementType.CONSTRUCTOR     //可以应用于构造函数。
ElementType.FIELD           //可以应用于字段或属性。
ElementType.LOCAL_VARIABLE  //可以应用于局部变量。
ElementType.METHOD          //可以应用于方法级注释。
ElementType.PACKAGE         //可以应用于包声明。
ElementType.PARAMETER       //可以应用于方法的参数。

@Retention
SOURCE     //在源文件中有效(即源文件保留)
CLASS      //在 class 文件中有效(即 class 保留)
RUNTIME    //在运行时有效(即运行时保留)

自定义注解

自定义注解@NotNull

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.FIELD)
//作用于属性
@Retention(RetentionPolicy.RUNTIME)
//作用于运行时
public @interface NotNull {//提示信息String message() default "";// 长度int length() default 0;// 与长度有关的提示String lengthmessage() default "";
}

对象克隆

为什么要克隆?

        克隆可以实现对象的快速备份,在实际中,一个模型类需要为不同层提供不同的对象,就需要将一个对象的数据克隆到另一个对象中。

        为什么不直接new一个对象,new创建出来的对象不包含我们想要的数据,

    Admin admin1 = new Admin();Admin admin2 = admin1; 

        这种情况虽然创造了两个Admin 引用,但是两个Admin引用最终指向同一个对象,对一个进行操作时,相当于对另一个也做出同样操作,不是我们想要的结果。

        而克隆就能解决这一问题。

分类

浅克隆

        在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成
员变量,而引用类型的成员对象并没有复制。

实现方法:

通过覆盖Object类中的clone()方法就能实现浅克隆 

    //前提是实现Cloneable接口@Overrideprotected Person clone() throws CloneNotSupportedException {Person person = (Person)super.clone();return person;}

深克隆

        在克隆时,就算关联对象,也会就关联对象创建一个新的,称之为深克隆。

  

实现方法:

方法一:让关联对象也实现Cloneable接口,重写clone()方法,从而实现多级克隆,每关联一个对象,就让关联对象实现接口并重写clone()方法,逐层实现。

方法二:使用序列化与反序列化实现。

    //实现Serializable接口/*** 自定义克隆方法* @return*/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;}

 一步到位,不需要进行多级克隆。

http://www.xdnf.cn/news/95491.html

相关文章:

  • IDEA add gitlab account 提示
  • render props是什么?
  • 【MQ篇】RabbitMQ之发布订阅模式!
  • Hive中Map和Reduce阶段的分工
  • MySQL通用性能优化模板(MySQL General Performance Optimization Template)
  • MyBatis-Plus 使用 Wrapper 构建动态 SQL 有哪些优劣势?
  • 爱普生SG-8200CG可编程晶振成为工业自动化领域的理想选择
  • Tailwind CSS 实战:基于 Kooboo 构建个人博客页面
  • vue3中slot(插槽)的详细使用
  • JVM 生产环境问题定位与解决实战(七):实战篇——OSSClient泄漏引发的FullGC风暴
  • 事业单位体检心电图不合格类型有哪些
  • 视频监控从安装到优化的技术指南,视频汇聚系统EasyCVR智能安防系统构建之道
  • 如何使用 uv 构建 Python 包并本地安装
  • 配色之道:解码产品设计中的UI设计配色艺术
  • 卷积神经网络:视觉炼金术士的数学魔法
  • SQL进阶知识:四、索引优化
  • C# 使用Windows API实现键盘钩子的类
  • Java虚拟机面试题:JVM调优
  • 网页布局新视角:全局居中的魅力与应用
  • Jsoup、Selenium 和 Playwright 的含义、作用和区别
  • SpringBoot整合SSE,基于okhttp
  • Java面试:探索Spring Boot与微服务的深度挑战
  • 01 ubuntu中wps桌面快捷键无法使用
  • C++23 新特性:令声明顺序决定非静态类数据成员的布局 (P1847R4)
  • C++学习:六个月从基础到就业——STL算法(一) 基础与查找算法
  • JS通过GetCapabilities获取wms服务元数据信息并在SuperMap iClient3D for WebGL进行叠加显示
  • C++语言速成,语法及示例宝典汇总整理
  • 状态模式(State Pattern)详解
  • Hooks的使用限制及原因
  • 单例模式:确保唯一实例的设计模式