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

news2024/10/23 15:45:00

前言

在 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 和 Setter
    public 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.coloradmin.cn/o/2221691.html

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

相关文章

MySQL的安装(windows,Centos,ubuntu)

目录 在Windows下安装MySQL数据库 在Centos下安装MySQL数据库 在ubuntu下安装MySQL数据库 在Windows下安装MySQL数据库 安装程序的下载地址: https://dev.mysql.com/downloads/ 点击之后就会出现下面的页面 接下来根据安装提示进行操作即可 在Centos下安装MySQL数据库 1.确认…

VMware中Ubuntu安装

VMware官网&#xff1a;https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion 先在官网下载VMware&#xff0c;一直根据默认点下一步就好了&#xff0c;记得更改安装地址哦&#xff0c;否则默认下在C盘里。 先下载好Ubuntu映像文件&#xff1a;https://…

No.18 笔记 | XXE(XML 外部实体注入)漏洞原理、分类、利用及防御整理

一、XXE 漏洞概述 &#xff08;一&#xff09;定义 XXE&#xff08;XML 外部实体注入&#xff09;漏洞源于 XML 解析器对外部实体的不当处理&#xff0c;攻击者借此注入恶意 XML 实体&#xff0c;可实现敏感文件读取、远程命令执行和内网渗透等危险操作。 &#xff08;二&am…

[含文档+PPT+源码等]精品基于Nodejs实现的水果批发市场管理系统的设计与实现

基于Node.js实现的水果批发市场管理系统的设计与实现背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、行业背景与市场需求 水果批发市场的重要性&#xff1a; 水果批发市场作为农产品流通的重要环节&#xff0c;承载着从生产者到消费者之间的桥梁作用。它的运营效…

传统园区与智慧园区:现代化发展的差异和优势

传统园区和智慧园区代表着城市发展不同阶段的产物&#xff0c;两者在功能、管理、环境等多个方面存在显著差异。通过对传统园区和智慧园区进行对比&#xff0c;可以清晰地看到智慧园区的诸多优势所在。 1. 功能对比&#xff1a; 传统园区通常以简单的生产、办公和商业为主要功…

1.深入理解MySQL索引底层数据结构与算法

文章目录 索引的概念数据结构二叉树红黑树B-B两者的区别 Hash 引擎数据所在位置对应关系MyISAMInnoDB 索引主键聚集索引非聚集索引联合索引 如有写的不对的请指正。 索引的概念 索引是帮助MySQL高效获取数据的排好序的数据结构 数据结构 网址&#xff1a; https://www.cs.us…

Kafka-设计思想-2

一、消息传递语义 现在我们对生产者和消费者的工作方式有了一些了解&#xff0c;让我们讨论一下Kafka在生产者和消费者之间提供的语义保证。 1、最多发送一次&#xff1a;会造成数据丢失 2、至少发送一次&#xff1a;会造成数据重复消费 3、只发送一次&#xff1a;我们想要的效…

MDB收款适配器MDBPOS

LETPOS精简版MDBPOS&#xff08;直接连接MDB协议的刷卡器&#xff0c;按照设定价格收款&#xff0c;输出脉冲&#xff09; 通过串口设定价格&#xff0c;脉冲宽度。 有人刷卡&#xff0c;扣款成功&#xff0c;输出脉冲&#xff0c;使用简单 适合把MDB协议的刷卡器连接到脉冲投…

【算法】归并排序概念及例题运用

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

小程序视频SDK解决方案,提供个性化开发和特效定制设计

美摄科技作为视频处理技术的领航者&#xff0c;深知在这一变革中&#xff0c;每一个细微的创新都能激发无限可能。因此&#xff0c;我们精心打造了一套小程序视频SDK解决方案&#xff0c;旨在满足不同行业、不同规模客户的多元化需求&#xff0c;携手共创视频内容的璀璨未来。 …

这几次比赛题解

因为考虑到再看&#xff0c;所以将所有题目都做成了pdf格式 梦熊十三连测 T1 这道题其实什么也不用想&#xff0c;就按照题目给的意思来打代码就行&#xff0c;这就有40分可以拿。懒人做法 #include<bits/stdc.h> using namespace std; typedef long long ll; ll read…

中航资本:股票显示缺口什么意思啊?股票有缺口一定会补吗?

股票显现缺口什么意思啊&#xff1f; 股票显现缺口是指股票在运行进程中&#xff0c;忽然上涨或许下跌使股价远离上一个交易日收盘价的状况&#xff0c;也便是股票当天的开盘价格和股票前一个交易日的收盘价格违背崎岖很大。在K线图中&#xff0c;缺口表现为股价在持续动摇中有…

MT-Pref数据集:包含18种语言的18k实例,涵盖多个领域。实验表明它能有效提升Tower模型在WMT23和FLORES基准测试中的翻译质量。

2024-10-10&#xff0c;由电信研究所、里斯本大学等联合创建MT-Pref数据集&#xff0c;它包含18种语言方向的18k实例&#xff0c;覆盖了2022年后的多个领域文本。通过在WMT23和FLORES基准测试上的实验&#xff0c;我们展示了使用MT-Pref数据集对Tower模型进行对齐可以显著提高翻…

React实现购物车功能

今日学习React的useReducer&#xff0c;实现了一个购物车功能 文章目录 目录 效果展示 逻辑代码 CSS代码 效果展示 逻辑代码 import {useReducer} from "react"; import ./index.css; import { message} from antd;export function ShoppingCount(){// 初始化购…

钡铼技术边缘计算2DIN2DO工业无线路由器R40A

R40A不仅具备了传统工业无线路由器的基本功能&#xff0c;如4G网络连接、稳定的数据传输等&#xff0c;还创新性地整合了可编程逻辑控制器&#xff08;PLC&#xff09;功能、多种工业协议转换能力以及数据采集终端的功能。 强大的边缘计算能力 随着物联网技术的发展&#xff…

STM32_实验5_中断实验

通过外部中断来检测四个按键按下的状态&#xff1a; WK_UP 控制蜂鸣器响和停 KEY0 控制 LED_R 互斥点亮 KEY1 控制 LED_G 互斥点亮 KEY2 控制 LED_B 互斥点亮。 中断的基本概念&#xff1a; 中断请求&#xff08;IRQ&#xff09;&#xff1a; 当发生某个特定事件&#xff08;例…

如何通过谷歌外推占据搜索引擎首页?

外贸企业在推广过程中&#xff0c;如何在谷歌搜索引擎中占据有利位置&#xff0c;获取更多曝光&#xff0c;GLB谷歌霸屏服务就可以派上用场。它通过高效的品牌外推策略&#xff0c;可以让你的企业信息在谷歌中实现“霸屏”效果&#xff0c;特别是长尾关键词的全面覆盖 很多企业…

如何实现安川MP3300运动控制器与西门子1200系列PLC进行ModbusTCP通讯

在工业自动化中&#xff0c;实现不同品牌、不同型号设备之间的通讯是确保生产流程顺畅、高效运行的关键。本文详细介绍了安川MP3300运动控制器与西门子1200系列PLC进行ModbusTCP通讯的具体方法。 一&#xff0e;软硬件需求 1.一台安川MP3300CPU301&#xff0c;其IP地址是192.…

android11 usb摄像头添加多分辨率支持

部分借鉴于&#xff1a;https://blog.csdn.net/weixin_45639314/article/details/142210634 目录 一、需求介绍 二、UVC介绍 三、解析 四、补丁修改 1、预览的限制主要存在于hal层和framework层 2、添加所需要的分辨率&#xff1a; 3、hal层修改 4、frameworks 5、备…

OceanBase 首席科学家阳振坤:大模型时代的数据库思考

2024年 OceanBase 年度大会 即将于10月23日&#xff0c;在北京举行。 欢迎到现场了解更多“SQL AI ” 的探讨与分享&#xff01; 近期&#xff0c;2024年金融业数据库技术大会在北京圆满举行&#xff0c;聚焦“大模型时代下数据库的创新发展”议题&#xff0c;汇聚了国内外众多…