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
英文地址,請注明出處:http://en.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;主要用于數據的存儲…