Java 源码 - java.lang.Void

430 阅读2分钟

概述

Void 类是无法实例化的占位符类,用于保存对表示Java关键字void的 Class 对象的引用。

正如源码所言

 The {@code Void} class is an uninstantiable placeholder class to hold a reference to the {@code Class} object representing the Java keyword void.

所以void也有对应的包装类java.lang.Void,不过我们无法直接对它们进行操作

继承关系

public final class Void final类,无父类。

成员变量

只有一个成员变量 返回Void类对应的基础类型的名称,也就是"void" 

public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void");

构造方法

不能被实例化

private Void() {}

从Void看void

我们的基础类型好像都有一个封装类,比如int基本类型的封装类是Integer,char基本类型的封装类是Character,void也不例外,他也有一个封装类叫做Void,没错就是把“v”换成了大写的V。你可以这样去理解Void:

其实Void类是一个不可实例化的占位符类,用来保存一个引用代表Java关键字void的Class对象。
Void类型不可以继承和实例化。而且修饰方法时候必须返回null。

下面我们再来研究研究这个Void。

(1)确定类型:Void是一个类,void就是一个基本类型

public class Test {
    public static void main(String[] args) {
        System.out.println(Void.class); 
        System.out.println(void.class); 
    }
}
//output
//class java.lang.Void
//void

(2)基本使用:必须且只能返回null

public class Test {
     //返回void,return可有可无
    public void a1() {
        return;
    }
    //必须且只能返回null
    public Void a2() {
        return null; 
    }
}

(3)使用场景:在反射中确定某个函数的返回类型

public class Test {
    // 在这里定义两个方法:
    //(1)a方法返回void
    //(2)b方法返回int
    public void a() {}
    public int b() {
        return 1;
    }
    public static void main(String args[]) {
        for (Method method : Test.class.getMethods()) {
            if (method.getReturnType().equals(Void.TYPE)) {
                System.out.println("返回void的方法是:"+method.getName());
            }
            else if(method.getReturnType().equals(Integer.TYPE)) {
                System.out.println("返回int的方法是:"+method.getName());
            }
        }
    }
}
//output
//返回void的方法是:main
//返回int的方法是:b
//返回void的方法是:a

(4)使用场景:泛型中使用

Future用来保存结果。Future的get方法返回结果(类型为T)。但如果操作并没有返回值呢?这种情况下就可以用Future表示。当调用get后结果计算完毕则返回后将会返回null。

Void也用于无值的Map中,例如Map<,Void>这样map将具Set有一样的功能。