Java中`void`和`Void`的區(qū)別和特性詳解
前言
在 Java 編程中,void 和 Void 是兩個(gè)容易混淆的概念。雖然它們看起來(lái)相似,但實(shí)際上有著截然不同的用途和特性。
void關(guān)鍵字
定義
void是 Java 中的一個(gè)關(guān)鍵字。- 用于方法聲明中,表示該方法不返回任何值。
用途
- 當(dāng)一個(gè)方法執(zhí)行某些操作(如打印、修改數(shù)據(jù)等),但不需要返回結(jié)果時(shí),可以使用
void作為返回類型。 - 方法內(nèi)部可以有任意數(shù)量的語(yǔ)句,但不能有
return語(yǔ)句返回一個(gè)值。不過(guò),可以使用return;來(lái)提前結(jié)束方法。
示例
public class Example {
public static void main(String[] args) {
// 調(diào)用一個(gè) void 方法
printHello();
}
// 定義一個(gè) void 方法
public static void printHello() {
System.out.println("Hello, World!");
}
}
在這個(gè)例子中,printHello 方法沒(méi)有任何返回值,它只是簡(jiǎn)單地打印一條消息。
Void類
定義
Void是java.lang包中的一個(gè)類。- 它是
void關(guān)鍵字的引用類型包裝類。 Void類是一個(gè)不可實(shí)例化的類(即不能創(chuàng)建Void對(duì)象)。Void類只有一個(gè)靜態(tài)字段NULL,通常用來(lái)表示沒(méi)有實(shí)際的Void值。
用途
- 主要用于泛型(Generics)中,因?yàn)榉盒筒荒苤苯邮褂没绢愋突?
void關(guān)鍵字。 - 在某些情況下,特別是使用函數(shù)式接口(如
Consumer或Supplier)時(shí),Void可以用來(lái)表示沒(méi)有返回值的情況。
示例
泛型中的使用
import java.util.ArrayList;
import java.util.List;
public class VoidExample {
public static void main(String[] args) {
// 創(chuàng)建一個(gè) List<Void>,但實(shí)際上我們不會(huì)真正存儲(chǔ) Void 實(shí)例
List<Void> voidList = new ArrayList<>();
// 嘗試添加 null 到列表中
voidList.add(null);
// 打印列表
for (Void v : voidList) {
System.out.println(v); // 輸出: null
}
}
}
在這個(gè)例子中,雖然我們創(chuàng)建了一個(gè) List<Void>,但由于 Void 類不可實(shí)例化,我們只能將 null 添加到列表中。
函數(shù)式接口中的使用
import java.util.function.Consumer;
public class VoidExample {
public static void main(String[] args) {
// 使用 Consumer<Void> 表示一個(gè)消費(fèi)者,它接受一個(gè) Void 類型的參數(shù)
Consumer<Void> consumer = (v) -> {
System.out.println("This is a consumer that takes no input.");
};
// 傳遞 null 作為 Void 類型的值
consumer.accept(null);
}
}
在這個(gè)例子中,Consumer<Void> 表示一個(gè)消費(fèi)者,它接受一個(gè) Void 類型的參數(shù)。由于 Void 類不可實(shí)例化,我們傳遞 null 作為參數(shù)。
獲取Void的唯一實(shí)例
public class VoidExample {
public static void main(String[] args) {
// 獲取 Void 的唯一實(shí)例
Void aVoid = null; // 或者 Void aVoid = Void.TYPE;
// 打印 Void 實(shí)例
System.out.println(aVoid); // 輸出: null
}
}
在這個(gè)例子中,Void 類有一個(gè)靜態(tài)字段 NULL,我們可以使用 null 或 Void.TYPE 來(lái)表示這個(gè)唯一的實(shí)例。
實(shí)際代碼例子
使用R<Void>的刪除操作
假設(shè)你有一個(gè) RESTful API 控制器,其中包含一個(gè)刪除記錄的方法:
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);
}
}
}
// 自定義響應(yīng)類
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;
}
}
解析
@DeleteMapping 注解
@DeleteMapping用于映射 HTTP DELETE 請(qǐng)求到特定的處理方法。/deleteById/{detailId}是請(qǐng)求路徑,其中{detailId}是路徑變量,表示要?jiǎng)h除的記錄的 ID。
方法簽名
public R<Void> deleteById(@PathVariable Long detailId)R<Void>表示返回一個(gè)泛型類型R,其泛型參數(shù)是Void。這意味著該方法不會(huì)返回具體的業(yè)務(wù)數(shù)據(jù),只會(huì)返回一個(gè)狀態(tài)信息。@PathVariable Long detailId表示從 URL 路徑中提取detailId參數(shù),并將其作為方法參數(shù)傳遞。
方法體
return toAjax(iMmsWarehouseDetailedAppService.deleteById(detailId));iMmsWarehouseDetailedAppService.deleteById(detailId)調(diào)用服務(wù)層的方法來(lái)刪除指定 ID 的記錄。toAjax(...)是一個(gè)工具方法,將服務(wù)層的返回結(jié)果轉(zhuǎn)換為一個(gè)R類型的對(duì)象,通常包含成功或失敗的狀態(tài)碼和消息。
自定義響應(yīng)類 R<T>
R<T>是一個(gè)泛型類,用于封裝 API 的響應(yīng)數(shù)據(jù)。- 它包含三個(gè)屬性:
code(狀態(tài)碼)、message(消息)和data(數(shù)據(jù))。 data屬性的類型是泛型T,當(dāng)T為Void時(shí),表示該方法不返回具體的業(yè)務(wù)數(shù)據(jù)。
工具方法 toAjax
toAjax是一個(gè)工具方法,用于將布爾值轉(zhuǎn)換為R對(duì)象。- 如果刪除成功,返回
R<Void>對(duì)象,包含成功狀態(tài)碼和消息;否則,返回失敗狀態(tài)碼和消息。
總結(jié)
void是一個(gè)關(guān)鍵字,用于方法聲明,表示該方法不返回任何值。Void是一個(gè)類,主要用于泛型和某些特定場(chǎng)景下表示沒(méi)有返回值的情況。它是一個(gè)不可實(shí)例化的類,只有一個(gè)靜態(tài)字段NULL。
void
- 定義:
void是 Java 中的一個(gè)關(guān)鍵字。 - 用途:用于方法聲明,表示該方法不返回任何值。
- 通俗理解:
void就像一個(gè)“空盒子”,表示這個(gè)方法執(zhí)行完之后不會(huì)給你任何東西。它只是做一些事情,比如打印信息、修改數(shù)據(jù)等,但不會(huì)返回任何結(jié)果。
Void
- 定義:
Void是java.lang包中的一個(gè)類。 - 用途:主要用于泛型中,因?yàn)榉盒筒荒苤苯邮褂没绢愋突?
void關(guān)鍵字。 - 通俗理解:
Void是一個(gè)特殊的“盒子”,雖然它里面什么也沒(méi)有(不可實(shí)例化),但它可以用來(lái)表示“沒(méi)有具體的返回值”。在某些情況下,特別是在使用泛型時(shí),我們需要一個(gè)占位符來(lái)表示沒(méi)有返回值的情況,這時(shí)就可以使用Void。
通俗對(duì)比
void:方法執(zhí)行完后沒(méi)有任何返回值,就像你做了一件事但沒(méi)有得到任何回報(bào)。Void:方法可能有返回值,但返回的是一個(gè)特殊的對(duì)象,表示“沒(méi)有具體的業(yè)務(wù)數(shù)據(jù)”,但它仍然可以包含一些狀態(tài)信息(如成功或失敗的狀態(tài)碼和消息)。
附:Java 方法中加void和不加void的區(qū)別
只要記住void即無(wú)返回值就OK了,如果不用void,那么這個(gè)地方一定是被一個(gè)其它的數(shù)據(jù)類型所替代,比如下面用的是String,當(dāng)然也可能是int或者Boolean等等,那么此時(shí)我們下面就要有一個(gè)return返回值。
package com.Thursday.one;
public class Variable {
public static void speaker(){
System.out.println("你好");
}
public static String Talk(){
return "hello";
}
public static void main(String[] args) {
speaker();
Talk();
String aString = Talk();
System.out.println(aString);
}
}到此這篇關(guān)于Java中void和Void的區(qū)別和特性的文章就介紹到這了,更多相關(guān)Java void和Void區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis實(shí)現(xiàn)一對(duì)一關(guān)聯(lián)映射實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于mybatis實(shí)現(xiàn)一對(duì)一關(guān)聯(lián)映射的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
MyBatisPlus標(biāo)準(zhǔn)數(shù)據(jù)層CRUD的使用詳解
這篇文章主要介紹了MyBatisPlus標(biāo)準(zhǔn)數(shù)據(jù)層CRUD的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
SpringBoot自動(dòng)裝配原理及過(guò)程解讀
文章解析SpringBoot自動(dòng)裝配機(jī)制,結(jié)合SPI源碼分析與手寫Starter實(shí)踐,闡述如何通過(guò)ServiceLoader和SpringFactoriesLoader實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及動(dòng)態(tài)配置加載,并利用條件注解@Conditional進(jìn)行智能過(guò)濾,最終指導(dǎo)開(kāi)發(fā)者自定義Starter并配置屬性提示2025-09-09
Springboot如何讀取resources下的json配置文件
這篇文章主要介紹了Springboot如何讀取resources下的json配置文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

