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

