Java 中 `void` 和 `Void` 的区别

前言

在 Java 编程中,voidVoid 是两个容易混淆的概念。虽然它们看起来相似,但实际上有着截然不同的用途和特性。

void 关键字

定义

  • void 是 Java 中的一个关键字。
  • 用于方法声明中,表示该方法不返回任何值。

用途

  • 当一个方法执行某些操作(如打印、修改数据等),但不需要返回结果时,可以使用 void 作为返回类型。
  • 方法内部可以有任意数量的语句,但不能有 return 语句返回一个值。不过,可以使用 return; 来提前结束方法。

示例

public class Example {public static void main(String[] args) {// 调用一个 void 方法printHello();}// 定义一个 void 方法public static void printHello() {System.out.println("Hello, World!");}
}

在这个例子中,printHello 方法没有任何返回值,它只是简单地打印一条消息。

Void

定义

  • Voidjava.lang 包中的一个类。
  • 它是 void 关键字的引用类型包装类。
  • Void 类是一个不可实例化的类(即不能创建 Void 对象)。
  • Void 类只有一个静态字段 NULL,通常用来表示没有实际的 Void 值。

用途

  • 主要用于泛型(Generics)中,因为泛型不能直接使用基本类型或 void 关键字。
  • 在某些情况下,特别是使用函数式接口(如 ConsumerSupplier)时,Void 可以用来表示没有返回值的情况。

示例

泛型中的使用
import java.util.ArrayList;
import java.util.List;public class VoidExample {public static void main(String[] args) {// 创建一个 List<Void>,但实际上我们不会真正存储 Void 实例List<Void> voidList = new ArrayList<>();// 尝试添加 null 到列表中voidList.add(null);// 打印列表for (Void v : voidList) {System.out.println(v);  // 输出: null}}
}

在这个例子中,虽然我们创建了一个 List<Void>,但由于 Void 类不可实例化,我们只能将 null 添加到列表中。

函数式接口中的使用
import java.util.function.Consumer;public class VoidExample {public static void main(String[] args) {// 使用 Consumer<Void> 表示一个消费者,它接受一个 Void 类型的参数Consumer<Void> consumer = (v) -> {System.out.println("This is a consumer that takes no input.");};// 传递 null 作为 Void 类型的值consumer.accept(null);}
}

在这个例子中,Consumer<Void> 表示一个消费者,它接受一个 Void 类型的参数。由于 Void 类不可实例化,我们传递 null 作为参数。

获取 Void 的唯一实例
public class VoidExample {public static void main(String[] args) {// 获取 Void 的唯一实例Void aVoid = null;  // 或者 Void aVoid = Void.TYPE;// 打印 Void 实例System.out.println(aVoid);  // 输出: null}
}

在这个例子中,Void 类有一个静态字段 NULL,我们可以使用 nullVoid.TYPE 来表示这个唯一的实例。

实际代码例子

使用 R<Void> 的删除操作

假设你有一个 RESTful API 控制器,其中包含一个删除记录的方法:

import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class WarehouseController {private final IMmsWarehouseDetailedAppService iMmsWarehouseDetailedAppService;public WarehouseController(IMmsWarehouseDetailedAppService iMmsWarehouseDetailedAppService) {this.iMmsWarehouseDetailedAppService = iMmsWarehouseDetailedAppService;}@DeleteMapping("/deleteById/{detailId}")public R<Void> deleteById(@PathVariable Long detailId) {boolean success = iMmsWarehouseDetailedAppService.deleteById(detailId);return toAjax(success);}public static <T> R<T> toAjax(boolean success) {if (success) {return new R<>(200, "操作成功", null);} else {return new R<>(500, "操作失败", null);}}
}// 自定义响应类
class R<T> {private int code;private String message;private T data;public R(int code, String message, T data) {this.code = code;this.message = message;this.data = data;}// Getter 和 Setterpublic int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}
}

解析

  1. @DeleteMapping 注解

    • @DeleteMapping 用于映射 HTTP DELETE 请求到特定的处理方法。
    • /deleteById/{detailId} 是请求路径,其中 {detailId} 是路径变量,表示要删除的记录的 ID。
  2. 方法签名

    • public R<Void> deleteById(@PathVariable Long detailId)
      • R<Void> 表示返回一个泛型类型 R,其泛型参数是 Void。这意味着该方法不会返回具体的业务数据,只会返回一个状态信息。
      • @PathVariable Long detailId 表示从 URL 路径中提取 detailId 参数,并将其作为方法参数传递。
  3. 方法体

    • return toAjax(iMmsWarehouseDetailedAppService.deleteById(detailId));
      • iMmsWarehouseDetailedAppService.deleteById(detailId) 调用服务层的方法来删除指定 ID 的记录。
      • toAjax(...) 是一个工具方法,将服务层的返回结果转换为一个 R 类型的对象,通常包含成功或失败的状态码和消息。
  4. 自定义响应类 R<T>

    • R<T> 是一个泛型类,用于封装 API 的响应数据。
    • 它包含三个属性:code(状态码)、message(消息)和 data(数据)。
    • data 属性的类型是泛型 T,当 TVoid 时,表示该方法不返回具体的业务数据。
  5. 工具方法 toAjax

    • toAjax 是一个工具方法,用于将布尔值转换为 R 对象。
    • 如果删除成功,返回 R<Void> 对象,包含成功状态码和消息;否则,返回失败状态码和消息。

总结

  • void 是一个关键字,用于方法声明,表示该方法不返回任何值。
  • Void 是一个类,主要用于泛型和某些特定场景下表示没有返回值的情况。它是一个不可实例化的类,只有一个静态字段 NULL

void

  • 定义void 是 Java 中的一个关键字。
  • 用途:用于方法声明,表示该方法不返回任何值。
  • 通俗理解void 就像一个“空盒子”,表示这个方法执行完之后不会给你任何东西。它只是做一些事情,比如打印信息、修改数据等,但不会返回任何结果。

Void

  • 定义Voidjava.lang 包中的一个类。
  • 用途:主要用于泛型中,因为泛型不能直接使用基本类型或 void 关键字。
  • 通俗理解Void 是一个特殊的“盒子”,虽然它里面什么也没有(不可实例化),但它可以用来表示“没有具体的返回值”。在某些情况下,特别是在使用泛型时,我们需要一个占位符来表示没有返回值的情况,这时就可以使用 Void

通俗对比

  • void:方法执行完后没有任何返回值,就像你做了一件事但没有得到任何回报。
  • Void:方法可能有返回值,但返回的是一个特殊的对象,表示“没有具体的业务数据”,但它仍然可以包含一些状态信息(如成功或失败的状态码和消息)。

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

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

相关文章

【linux】线程 (三)

13. 常见锁概念 &#xff08;一&#xff09;了解死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程占有的&#xff0c;且不释放的资源&#xff0c;而处于的一种永久等待状态 &#xff08;二&#xff09;死锁四个必要条件 互斥条件…

RK3568平台开发系列讲解(调试篇)debugfs 文件系统

🚀返回专栏总目录 文章目录 一、debugfs使用案例二、enable debugfs三、debugfs API3.1、创建目录3.2、创建文件3.3、帮助函数四、使用示例📢Linux 上有一些典型的问题分析手段,从这些基本的分析方法入手,你可以一步步判断出问题根因。这些分析手段,可以简单地归纳为下图…

Linux·文件与IO

1. 回忆文件操作相关知识 我们首先回忆一下关于文件的一些知识。 如果一个文件没有内容&#xff0c;那它到底有没有再磁盘中存在&#xff1f;答案是存在&#xff0c;因为 文件 内容 属性&#xff0c;即使文件内容为空&#xff0c;但属性信息也是要记录的。就像进程的…

基于STM32的Android控制智能家政机器人

基于STM32的Android控制智能家政机器人 基于STM32的Android控制智能家政机器人一、项目背景与意义二、系统设计方案三、硬件电路设计四、软件设计与实现4.1 Android端软件设计4.2 机器人端软件设计 五、系统调试与测试六、结论与展望七、附录 基于STM32的Android控制智能家政机…

从外行人的角度解释1Bit的模型,是怎样改变世界的

一个框架&#xff0c;和一篇论文&#xff0c;改变了模型训练的规则 框架是BitNET 论文https://arxiv.org/abs/2410.16144 有人问我什么是1.58Bit 是这样的。 fp16是一般情况下模型训练后产物的精度。 比如qwen2 8B fp16&#xff0c;文件大小15GB 如果量化成Q_4O&#xff…

24下河南秋季教资认定保姆级教程

教师资格认定前需要做的准备材料 准备身份证户口本 居住证 学生证 教师考试合格证明 普通话证书 学历证书 体检合格证书 近期一寸白底证件照 网上报名 河南24下教资认定 网上报名时间&#xff1a;10月21日-11月1日 现场确认 网上审核未通过的宝子&#xff0c;需要…

html+css+js实现Notification 通知

实现效果&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Notif…

k8s use-context是什么

kubectl 的 use-context 命令用于在 Kubernetes 集群中切换上下文&#xff08;context&#xff09;&#xff0c;从而方便地在多个集群或命名空间之间进行操作。一个上下文定义了 kubectl 使用的 集群、用户 和 命名空间 的组合。 use-context 的作用&#xff1a; 每个上下文&…

AOP学习

corol调用serverce不在是直接调用的是调用底层代理对象&#xff0c;由代理对象统一帮我们处理 AOP常见概念 通知类型 切面顺序

【C++】— 一篇文章让你认识STL

文章目录 &#x1f335;1.什么是STL&#xff1f;&#x1f335;2.STL的版本&#x1f335;3.STL的六大组件&#x1f335;4.STL的重要性&#x1f335;5. 如何学习STL&#x1f335;6. 学习STL的三种境界 &#x1f335;1.什么是STL&#xff1f; STL是Standard Template Library的简称…

Matlab软件进行金融时间序列数据的描述性统计代码

1、数据S&P500的收盘价格&#xff0c;return100*log(pt/pt-1) 方法1&#xff1a;用python代码 import numpy as np import pandas as pddef calculate_log_returns(prices):"""计算价格序列的对数收益率。参数:prices (numpy.array): 价格序列。返回:log_…

【实战指南】Vue.js 介绍组件数据绑定路由构建高效前端应用

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

ChatGPT 现已登陆 Windows 平台

今天&#xff0c;OpenAI 宣布其人工智能聊天机器人平台 ChatGPT 已开始预览专用 Windows 应用程序。OpenAI 表示&#xff0c;该应用目前仅适用于 ChatGPT Plus、Team、Enterprise 和 Edu 用户&#xff0c;是一个早期版本&#xff0c;将在今年晚些时候推出"完整体验"。…

LeetCode 热题100之哈希

1.两数之和 思路分析1&#xff08;暴力法&#xff09; 双重循环枚举满足num[i] nums[j] target的索引&#xff0c;刚开始不知道如何返回一对索引。后来知道可以直接通过return {i,j}返回索引&#xff1b;注意&#xff1a;j应该从i1处开始&#xff0c;避免使用两次相同的元素…

liunx线程

线程的概念 程序中的一个执行路线就是线程&#xff0c;线程就是一个进程内部的控制序列一个进程至少都有一个执行线程线程在进程内部运行&#xff0c;本质是在进程地址空间内运行liunx系统下&#xff0c;cpu眼里的PCB比传统进程更加轻量化透过虚拟地址空间&#xff0c;把进程的…

展会亮点回顾|HMS汽车工业通信解决方案

2024 汽车测试及质量监控博览会&#xff08;中国&#xff09;&#xff08;Testing Expo China – Automotive&#xff09;于 8 月 28 日至 30 日在上海世博展览馆顺利举行。作为汽车测试技术领域的顶级盛会&#xff0c;来自全球的行业领袖和技术专家齐聚一堂&#xff0c;共同探…

即时通讯 离线消息处理初版

离线消息处理 NotOnlineExecute package com.example.im.infra.executor.send;import com.example.im.endpoint.WebSocketEndpoint; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springf…

Django学习(三)

Django的设计模式及模板层 传统的MVC&#xff08;例如java&#xff09; Django的MTV 模板层&#xff1a; 模板加载&#xff1a; 代码&#xff1a; views.py def test_html(request):#方案一# from django.template import loader# 1. 使用loader加载模板# t loader.get_…

ICP算法理解入门之RT求解

本文仅仅分析了一下两组点云做好匹配好了之后&#xff0c; 如何解算RT&#xff0c; 并不涉及匹配过程&#xff0c;详细的匹配&#xff0c;下次再出一篇博客 ICP 求解旋转矩阵 ( R ) 的步骤 给定两个点云集合 ( P {p_1, p_2, …, p_n} )&#xff08;源点云&#xff09;和 ( Q…

uniapp-uniapp + vue3 + pinia 搭建uniapp模板

使用技术 ⚡️uni-app, Vue3, Vite, pnpm &#x1f4e6; 组件自动化引入 &#x1f34d; 使用 Pinia 的状态管理 &#x1f3a8; tailwindcss - 高性能且极具灵活性的即时原子化 CSS 引擎 &#x1f603; 各种图标集为你所用 &#x1f525; 使用 新的 <script setup> …