Java进阶4:泛型、序列化和反序列化

Java泛型

  • Java泛型是JDK5引入的一个新的特性,泛型提供了编译时的类型安全检测机制,这个机制运行程序员在编译的时候检测到非法的类型。
  • 泛型的本质是参数化类型,也就是所操作的数据类型被指定为一个参数。
泛型方法
  • 可以写一个泛型方法,这个方法在调用时候可以接受不同类型的参数,根据参数类型适当调用一个方法。
  • 定义泛型方法的规则

声明类型参数部分<>,定义在返回类型之前
声明多个类型参数,彼此用逗号隔开
类型参数能被用于声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符
方法体的声明和其他的方法一样,但是只能是代表引用型类型

  • 泛型标记符

E–Element(元素)
T–Type(Java类)
K–Key(键)
V–Value(值)
N–Number(数值类型)
?–不确定的类型

  • 声明实例,声明一个方法用于遍历各种数组
public class generics {//遍历元素的方法public static <E> void printArray(E[] type){for(E item:type){System.out.print(item);}System.out.println();}
}
public class Init {//main函数,程序入口public static void main(String[] args) {// 创建不同类型数组: Integer, Double 和 CharacterInteger[] intArray = { 1, 2, 3, 4, 5 };Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };generics.printArray(intArray);generics.printArray(doubleArray);generics.printArray(charArray);}
}
  • 界定类型参数
    有时候需要限制被允许传到一个类型参数种类范围。这需要用extends关键字来界定范围
public class Init {public static <T extends Comparable<T>> T maximum(T x, T y, T z){//使用Comparable<T>对范围进行界定,必须是可以被比较的类型T max = x; // 假设x是初始最大值if ( y.compareTo( max ) > 0 ){max = y; //y 更大}if ( z.compareTo( max ) > 0 ){max = z; // 现在 z 更大}return max; // 返回最大对象}//main函数,程序入口public static void main(String[] args) {System.out.printf( "%d, %d 和 %d 中最大的数为 %d\n\n",3, 4, 5, maximum( 3, 4, 5 ) );System.out.printf( "%.1f, %.1f 和 %.1f 中最大的数为 %.1f\n\n",6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );System.out.printf( "%s, %s 和 %s 中最大的数为 %s\n","pear","apple", "orange", maximum( "pear", "apple", "orange" ) );}
}
泛型类
  • 泛型类的定义只是在后面添加了类型参数的声明部分。
public class Box<T> {private T t;public void add(T t) {this.t = t;}public T get() {return t;}
类型通配符
  • 使用?代替具体的类型参数
  • 例如List<?>是所有的List以及List等具有具体类型参数的父类
import java.util.*;
public class Init {public static void getData(List<?> data) {System.out.println("data :" + data.get(0));}public static void main(String[] args) {List<String> name = new ArrayList<String>();List<Integer> age = new ArrayList<Integer>();List<Number> number = new ArrayList<Number>();name.add("icon");age.add(18);number.add(314);getData(name);getData(age);getData(number);}
}
  • 因为 getData() 方法的参数是 List<?> 类型的,所以 name,age,number 都可以作为这个方法的实参,这就是通配符的作用。

  • 对于通配符也可使用限定:List<? extends Number>

序列化

  • 一个对象可以被表示为一个字节序列,这个字节序列包含了这个对象的数据。
  • 将序列化写入文件之后还可以从文件中读取出来,并且对其进行反序列化。
  • 过程在Java虚拟机中独立,可以直接跨平台进行序列化和反序列化。
  • 如果一个类要想实现序列化,必须满足两个条件:

必须实现java.io.Serializable接口
这个类的所有属性必须是可被序列化的,如果有一个属性不能被序列化,这个属性必须被声明为短暂的

  • 下面的实例指明了构造一个可以被序列化的类
public class serializable implements java.io.Serializable {public String name;public String address;public transient int SSN;//transient修饰的作用,让某些变量不被序列化public int number;public void mailCheck(){System.out.println("Mailing a check to "+ this.name+" "+this.address);}
}
创建一个序列化对象
  • ObjectOutputStream类用于序列化一个对象。下面是一个实例,用于序列化一个对象。
  • 对于序列化,Java里面有一个特殊的方法用于输出序列化对象,这个方法包含在ObjectOutputStream类里面。
public final void writeObject(Object x) throws IOException

上述writeObject()方法用于序列化一个对象之后,输出到一个数据流,约定的Java中的序列化数据拓展名是.ser

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Init {public static void main(String[] args) {Employee employee = new Employee("ABC","12123",31232);try{FileOutputStream fileBuffer = new FileOutputStream("D:\\employee.ser");ObjectOutputStream out = new ObjectOutputStream(fileBuffer);//用FileOutputStream来初始化OjectOutputStreamout.writeObject(employee);out.close();fileBuffer.close();System.out.println("True");}catch (IOException i){i.printStackTrace();}}
}
反序列化对象
  • 对于反序列化,Java里面有一个特殊的方法用于输出序列化对象,这个方法包含在ObjectInputStream类里面。
public final Object readObject() throws IOException, ClassNotFoundException

上述readObject()对象用于在一个数据流中读取反序列化信息,并且实现反序列化。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Init {public static void main(String[] args) {Employee employee = null;try{FileInputStream fileBuffer = new FileInputStream("D:\\employee.ser");ObjectInputStream in = new ObjectInputStream(fileBuffer);//用FileInputStream来初始化ObjectInputStreamemployee = (Employee)in.readObject();in.close();fileBuffer.close();System.out.println("True");}catch (IOException i){i.printStackTrace();return;}catch (ClassNotFoundException c){System.out.println("Employee class Noet found!");c.printStackTrace();return;}employee.show();}
}

True
我叫ABC,我的工号是12123,我的薪水是31232.00
进程已结束,退出代码0

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

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

相关文章

RAG实战指南 Day 24:上下文构建与提示工程

【RAG实战指南 Day 24】上下文构建与提示工程 文章内容 开篇 欢迎来到"RAG实战指南"系列的第24天&#xff01;今天我们将深入探讨RAG系统中至关重要的上下文构建与提示工程技术。在检索增强生成系统中&#xff0c;如何有效地组织检索到的文档片段&#xff0c;并将…

AWD的攻击和防御手段

一、AWD相关介绍 AWD&#xff08;Attack With Defence&#xff09;是 CTF 线下赛中最接近真实攻防场景、观赏性和对抗性最强的赛制之一。 赛制本质 人人对抗&#xff1a;所有战队互为攻击者与防守者。 零和记分&#xff1a;你拿到的每一分都是别人的失分&#xff0c;总积分恒…

泛微OA8前台SQL注入

漏洞URL&#xff1a; http://106.15.190.147/js/hrm/getdata.jsp?cmdgetSelectAllId&sql***注入点 在getdata.jsp中&#xff0c;直接将request对象交给 weaver.hrm.common.AjaxManager.getData(HttpServletRequest, ServletContext) : 方法处理 在getData方法中&#xff0…

Android 蓝牙学习

在Android中&#xff0c;进行蓝牙设备扫描startDiscovery需要申请位置权限&#xff0c;但有的时候并不需要申请位置权限&#xff0c;就有了android:usesPermissionFlags"neverForLocation"&#xff0c;设置这个就不用申请位置权限来进行蓝牙扫描。 android:usesPerm…

Earth靶机攻略

一.环境准备 1.1Earth靶机环境准备 首先将我们解压好的的Earth.ova放入虚拟机里&#xff0c;并配置环境 将网络连接换成NET连接 二.信息搜集 2.1ip搜集 2.1.1使用netdiscover命令扫描靶机的ip地址,发现地址为192.168.182.137 2.2端口扫描 2.2.1使用nmap工具对目标机进行端…

java8 List常用基本操作(去重,排序,转换等)

参考简述网址: java8 List 根据对象某个字段或多个字段去重、筛选、List转Map、排序、分组、统计计数等等 list简单方法示例如下&#xff1a; 一、先定义一个订单对象&#xff08;Order&#xff09; public class Order {private Long id;private Long userId;private Strin…

【linux】HAProxy七层代理

HAPorxy简介HAProxy&#xff08;High Availability Proxy&#xff09;是一款高性能、开源的负载均衡器与反向代理服务器&#xff0c;主要用于 TCP 和 HTTP 协议的流量分发&#xff0c;广泛应用于高并发、高可用的网络架构中核心特性超高性能与低资源消耗基于单进程、多线程模型…

Android 的16 KB内存页设备需要硬件支持吗,还是只需要手机升级到Android15系统就可以

Android 的16 KB内存页设备需要硬件支持吗&#xff0c;还是只需要手机升级到Android15系统就可以&#xff1f; deepseek回答&#xff1a; DeepSeek R1 思考 3 秒 思考过程 好的&#xff0c;用户现在问的是Android的16 KB内存页设备是否需要硬件支持&#xff0c;还是只需要升级到…

相机内外参矩阵:从3D世界坐标到2D像素坐标变换

相机内外参矩阵&#xff1a;从3D世界坐标到2D像素坐标变换介绍**1. 内参矩阵&#xff08;Intrinsic Matrix, K&#xff09;****2. 外参矩阵&#xff08;Extrinsic Matrix, [R|t]&#xff09;****3. 完整投影过程&#xff08;世界坐标 → 像素坐标&#xff09;****步骤1&#xf…

哈希指针与数据结构:构建可信数字世界的基石

一、哈希指针的核心原理哈希指针是一种创新型数据结构&#xff0c;融合了传统指针的定位功能与密码学哈希的验证能力&#xff1a;双重功能&#xff1a;既存储数据地址&#xff0c;又包含该数据的哈希值&#xff0c;实现数据定位与完整性验证的统一。抗篡改机制&#xff1a;数据…

java实现一个方法,isTure则程序继续往下,为false则return的链式写法

以下是实现链式条件检查的Java方法&#xff0c;采用函数式风格设计。代码包含一个Chainable类&#xff0c;支持连续的check方法和多个终止操作&#xff08;如then, orElse等&#xff09;&#xff0c;满足在条件为false时中断链式调用并返回默认值的需求&#xff1a;import java…

数据结构学习之堆

本篇我们将学习新的数据结构——二叉树。 作者的个人gitee&#xff1a;楼田莉子 (riko-lou-tian) - Gitee.com 目录 树的概念 树形结构 非树形结构 树的相关术语 树的表示 树在实际生活上的应用 二叉树 慢二叉树 完全二叉树 二叉树的储存结构 二叉树的存储结构 顺序结构…

【csdn问答社区分析】前端开发热点问题全解析

前端时间我在csdn问答社区的前端部分"视察”了一圈发现了大家的问题主要集中在以下方面一、框架与组件库使用问题 Vue相关问题 组件化开发&#xff1a;如avue-crud组件自定义样式不生效、el-select大数据分页懒加载、element-plus表格动态列校验等。功能实现&#xff1a;包…

Pycharm2025 安装教程 免费分享 没任何套路

Pycharm 安装也是很简单的&#xff0c;简单过一下流程&#xff0c;如果需要的可以转存下载到自己电脑上。我用夸克网盘分享了「pycharm2025」&#xff0c;复制链接浏览器打开转存后即可下载。链接&#xff1a;https://pan.quark.cn/s/4bb74a939332备注&#xff1a;附带2023-202…

Javaweb————什么是超文本传输协议?

&#x1f3cd;️&#x1f3cd;️&#x1f3cd;️引言&#xff1a;什么是协议&#xff1f; 协议是一种约定&#xff0c;规定好一种信息的格式&#xff0c;如果发送方按照这种请求格式发送信息,那么接 收端就要按照这样的格式解析数据,否则就会出错&#xff0c;这就是协议 常用协…

UniappDay03

1.热门推荐-准备工作// 用defineProps获取页面参数,query const query defineProps<{type: string }>() const currHot hotMap.find((v) > v.type query.type) // 动态设置标题 uni.setNavigationBarTitle({ title: currHot!.title }) </script>2.获取热门推…

基于动态增强的 LLM 置信度方法研究

基于动态增强的 LLM 置信度方法研究 一、引言(Introduction) 大型语言模型(LLM)的性能提升高度依赖于对模型内部表征的精准调控 —— 表征工程通过优化模型中间层隐藏状态的传递规律,能够在不改变模型参数的前提下显著提升任务适应性(Wei et al., 2022)。当前主流方法中…

ComfyUI中运行Wan 2.1工作流,电影级视频,兼容Mac Windows

魔当(LM Downloader)是一个大模型应用下载工具 &#xff0c;目前 魔当 已经支持ComfyUI下载Wan 2.1视频模型。 魔当下载地址 https://seemts.com/ 先看生成效果 原始图片&#xff0c;你可以保存到自己电脑上测试 生成视频&#xff1a; 推荐提示词&#xff1a; A futurist…

CentOS 7 Linux 用 yum 安装 Docker,含 Docker 镜像无法拉取问题(即 docker pull 失败)的解决方案

CentOS 7 Linux 用 yum 安装 Docker,含 Docker 镜像无法拉取问题(即 docker pull 失败)的解决方案 本文对应的讲解视频链接:https://www.bilibili.com/video/BV1C48wzqE6T/ 文章目录 CentOS 7 Linux 用 yum 安装 Docker,含 Docker 镜像无法拉取问题(即 docker pull 失败…

XML的简略知识点

文章目录1. 基本概念2. 基本语法3. 示例4. 相关技术5. 应用场景XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言&#xff0c;核心特点是可扩展性和自我描述性。以下是其核心知识点&#xff1a; 1. 基本概念 用途&#xff1a;主要用于数据的存储…