Java进阶(一)

目录

一.Java注解

什么是注解?

内置注解

元注解

二.对象克隆

什么是对象克隆?

为什么用到对象克隆

三.浅克隆深克隆


一.Java注解

什么是注解?

java中注解(Annotation)又称java标注,是一种特殊的注释

        可以添加在包,类,成员变量,方法,参数等内容上面,Java标注可以通过反射获取标注内容。

        注解会随同代码被编译到字节码文件中,在运行时,可以通过反射机制获取到类中注解,然后根据不同的注解进行相应的解析。

内置注解

是java中已经定义好的注解。

@Override检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
@Deprecated标记过时方法。如果使用该方法,会报编译警告。
@SuppressWarnings指示编译器去忽略注解中声明的警告
@FunctionalInterface用于指示被修饰的接口是函数式接口。

元注解

注解的注解,用来定义其他注解的注解。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@Target(ElementType.METHOD)  标注此注解可以作用在方法上面。
@Target({ElementType.TYPE, ElementType.METHOD})标注此注解可以作用在类和方法上面。
@Retention(RetentionPolicy.SOURCE)  编译阶段有用的,可以不编译到字节码中。
@Retention(RetentionPolicy.RUNTIME)运行时有用的,编译到字节码文件中去。

 


 

二.对象克隆

什么是对象克隆?

        在已有的对象基础,克隆出一个新的对象,并将已有对象中的属性值复制到新克隆出来的对象中。

为什么用到对象克隆?

        经常在项目开发中,各层数据传输时,需要将一层中的数据,封装到另一个对象中去。

java中如何实现一个基本的对象克隆?

public class Person implements  Cloneable{int num;String name;@Overrideprotected Person clone() throws CloneNotSupportedException {Person person = (Person)super.clone();return person;}
}    //测试Person p1 = new Person(100,"jim");Person p2 =  p1.clone(); //克隆一个新的对象System.out.println(p1==p2);//false  说明是两个不同的对象

 


 

三.浅克隆深克隆

对于基本类型对象克隆时,可以将值直接复制到新对象中。

int a = 10;int b = a;b=20;

浅克隆主要是在于对象中关联的另一个对象是否能被克隆出一个新的对象。

如果克隆时,只是将关联对象的地址进行复制,那么就属于浅克隆。

如果克隆时,将关联的对象也一同克隆出了一个新的对象,那么就属于深克隆。

浅克隆:

深克隆: 

 

         简单来说,浅克隆复制的是基本类型的值,复制引用类型的地址;深克隆则会创建全新的对象,实现对象及其引用类型属性的完全复制。

如何实现深克隆

方式1: 在克隆对象时,将对象中关联的对象也一同进行克隆,虽然能实现,但是要逐级进行克隆,层级较多时,比较麻烦。必须实现Cloneable接口。

@Overrideprotected Person clone() throws CloneNotSupportedException {Person person = (Person) super.clone();//深度复制  联同person中关联的对象也一同克隆.person.address = (Address) person.address.clone();return person;}

方式2: 使用对象序列化反序列化 ,需要我们自己定义一个克隆方法,先将对象进行序列化,然后再进行反序列化,自动将多级关联的对象也一并重新创建,使用起来比较方便,注意需要序列化的类,必须要实现Serializable接口。

public Person myclone() {Person person = null;try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝//序列化,将java中的对象输出(写)到文件中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;}

对象序列化

将java中的对象输出到一个文件中,ObjectOutputStream

反序列化

将文件中的信息输入到程序,创建一个新的对象,ObjectInputStream

创建对象的几种方式:

1.new 对象

2.反序列化

3.反射机制

4.对象克隆


 感谢你的阅读与关注,如有问题欢迎探讨!💓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/67036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PyCharm】将包含多个参数的 shell 脚本配置到执行文件来调试 Python 程序

要配置 PyCharm 以使用包含多个参数的 shell 脚本(如 run.sh)来调试 Python 程序,您可以按照以下步骤操作: 创建一个新的运行/调试配置: 在 PyCharm 中,点击“运行”菜单旁边的齿轮图标,选择“…

即梦(Dreamina)技术浅析(二):后端AI服务

1. 文本处理(Text Processing) 1.1 功能概述 文本处理模块的主要任务是将用户输入的文字提示词转换为机器可以理解的向量表示。这一过程包括分词、词嵌入和语义编码,旨在捕捉文本的语义信息,为后续的图像和视频生成提供准确的指导。 1.2 关键技术 1.分词(Tokenization…

蓝桥杯之c++入门(一)【第一个c++程序】

目录 前言一、第⼀个C程序1.1 基础程序1.2 main函数1.3 字符串1.4 头文件1.5 cin 和 cout 初识1.6 名字空间1.7 注释 二、四道简单习题(点击跳转链接)练习1:Hello,World!练习2:打印飞机练习3:第⼆个整数练习4&#xff…

【C++初阶】第11课—vector

文章目录 1. 认识vector2. vector的遍历3. vector的构造4. vector常用的接口5. vector的容量6. vector的元素访问7. vector的修改8. vector<vector\<int\>>的使用9. vector的使用10. 模拟实现vector11. 迭代器失效11.1 insert插入数据内部迭代器失效11.2 insert插入…

【AIGC学习笔记】扣子平台——精选有趣应用,探索无限可能

背景介绍&#xff1a; 由于近期业务发展的需求&#xff0c;我开始接触并深入了解了扣子平台的相关知识&#xff0c;并且通过官方教程自学了简易PE工作流搭建的技巧。恰逢周会需要准备与工作相关的分享主题&#xff0c;而我作为一个扣子平台的初学者&#xff0c;也想探索一下这…

mysql 学习6 DML语句,对数据库中的表进行 增 删 改 操作

添加数据 我们对 testdatabase 数据中 的 qqemp 这张表进行 增加数据&#xff0c;在这张表 下 打开 命令行 query console 在 软件中就是打开命令行的意思 可以先执行 desc qqemp; 查看一下当前表的结构。 插入一条数据 到qqemp 表&#xff0c;插入时要每个字段都有值 insert…

Java Web-Request与Response

在 Java Web 开发中&#xff0c;Request 和 Response 是两个非常重要的对象&#xff0c;用于在客户端和服务器之间进行请求和响应的处理&#xff0c;以下是详细介绍&#xff1a; Request&#xff08;请求对象&#xff09; Request继承体系 在 Java Web 开发中&#xff0c;通…

李沐vscode配置+github管理+FFmpeg视频搬运+百度API添加翻译字幕

终端输入nvidia-smi查看cuda版本 我的是12.5&#xff0c;在网上没有找到12.5的torch&#xff0c;就安装12.1的。torch&#xff0c;torchvision&#xff0c;torchaudio版本以及python版本要对应 参考&#xff1a;https://blog.csdn.net/FengHanI/article/details/135116114 创…

论文阅读(十六):利用线性链条件随机场模型检测阵列比较基因组杂交数据的拷贝数变异

1.论文链接&#xff1a;Detection of Copy Number Variations from Array Comparative Genomic Hybridization Data Using Linear-chain Conditional Random Field Models 摘要&#xff1a; 拷贝数变异&#xff08;CNV&#xff09;约占人类基因组的12%。除了CNVs在癌症发展中的…

Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架构与负载均衡方案

在微服务体系中&#xff0c;Nacos 主要承担“服务注册与发现、配置中心”的职能&#xff0c;Gateway&#xff08;如 Spring Cloud Gateway&#xff09;通常负责“路由转发、过滤、安全鉴权、灰度流量控制”等功能&#xff0c;而 Nginx 则常被用作“边缘反向代理”或“统一流量入…

Next.js 实战 (十):中间件的魅力,打造更快更安全的应用

什么是中间件&#xff1f; 在 Next.js 中&#xff0c;中间件&#xff08;Middleware&#xff09;是一种用于处理每个传入请求的功能。它允许你在请求到达页面之前对其进行修改或响应。 通过中间件&#xff0c;你可以实现诸如日志记录、身份验证、重定向、CORS配置、压缩等任务…

ElasticSearch-文档元数据乐观并发控制

文章目录 什么是文档&#xff1f;文档元数据文档的部分更新Update 乐观并发控制 最近日常工作开发过程中使用到了 ES&#xff0c;最近在检索资料的时候翻阅到了 ES 的官方文档&#xff0c;里面对 ES 的基础与案例进行了通俗易懂的解释&#xff0c;读下来也有不少收获&#xff0…

实验二 数据库的附加/分离、导入/导出与备份/还原

实验二 数据库的附加/分离、导入/导出与备份/还原 一、实验目的 1、理解备份的基本概念&#xff0c;掌握各种备份数据库的方法。 2、掌握如何从备份中还原数据库。 3、掌握数据库中各种数据的导入/导出。 4、掌握数据库的附加与分离&#xff0c;理解数据库的附加与分离的作用。…

技术中台与终搜——2

文章目录 5、语言处理与自动补全技术探测5.1 自定义语料库5.1.1 语料库映射OpenAPI5.1.2 语料库文档OpenAPI 5.2 产品搜索与自动补全5.2.1 汉字补全OpenAPI5.2.2 拼音补全OpenAPI 5.3 产品搜索与语言处理5.3.1 什么是语言处理&#xff08;拼写纠错&#xff09;5.3.2 语言处理Op…

15_业务系统基类

创建脚本 SystemRoot.cs 因为 业务系统基类的子类 会涉及资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 所以在业务系统基类 提取引用资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 并调用单例初始化 using UnityEngine; // 功能 : 业务系统基类 public c…

k8s优雅重启

理论上处于terminating状态的pod&#xff0c;k8s 就会把它从service中移除了&#xff0c;只用配置一个优雅停机时长就行了。kubectl get endpoints 验证 因此&#xff0c;优雅重新的核心问题&#xff0c;是怎么让空闲长连接关闭&#xff0c;再等待处理中的请求执行完。 一些底…

【Linux】华为服务器使用U盘安装统信操作系统

目录 一、准备工作 1.1 下载UOS官方系统 &#xff11;.&#xff12;制作启动U盘 1.3 服务器智能管理系统iBMC 二、iBMC设置U盘启动 一、准备工作 1.1 下载UOS官方系统 服务器CPU的架构是x86-64还是aarch64&#xff09;,地址&#xff1a;统信UOS生态社区 - 打造操作系统创…

27. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表服务

报表是每个记账应用所具备的功能&#xff0c;要实现报表功能就需要把账本的核心功能&#xff08;记账&#xff09;完成&#xff0c;因此报表服务作为本专栏第一部分单体应用开发中最后一个要实现的功能&#xff0c;这一篇文章很简单&#xff0c;我们一起来实现一个简单的报表服…

基于 Node.js 的天气查询系统实现(附源码)

项目概述 这是一个基于 Node.js 的全栈应用,前端使用原生 JavaScript 和 CSS,后端使用 Express 框架,通过调用第三方天气 API 实现天气数据的获取和展示。 主要功能 默认显示多个主要城市的天气信息 支持城市天气搜索 响应式布局设计 深色主题界面 优雅的加载动画 技术栈 …

cursor重构谷粒商城04——vagrant技术快速部署虚拟机

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…