java.lang.Void类的解析与使用详解

今天在查看源码的时候发现了 java.lang.Void 的类。这个有什么作用呢?

先通过源码查看下

package java.lang;
/**
 * The {@code Void} class is an uninstantiable placeholder class to hold a
 * reference to the {@code Class} object representing the Java keyword
 * void.
 *
 * @author unascribed
 * @since  JDK1.1
 */
public final
class Void {
  /**
   * The {@code Class} object representing the pseudo-type corresponding to
   * the keyword {@code void}.
   */
  @SuppressWarnings("unchecked")
  public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void");

  /*
   * The Void class cannot be instantiated.
   */
  private Void() {}
}

从源码中发现该类是final的,不可继承,并且构造是私有的,也不能 new。

那么该类有什么作用呢?

下面是我们先查看下 java.lang.Integer 类的源码

我们都知道 int 的包装类是 java.lang.Integer

从这可以看出 java.lang.Integer 是 int 的包装类。

同理,通过如下 java.lang.Void 的源码可以看出 java.lang.Void 是 void 关键字的包装类。

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

Void 使用

Void类是一个不可实例化的占位符类,如果方法返回值是Void类型,那么该方法只能返回null类型。

示例如下:

public Void test() {
  return null;
}

使用场景一:

Future<Void> f = pool.submit(new Callable() {
  @Override
  public Void call() throws Exception {
    ......
    return null;
  }

});

比如使用 Callable接口,该接口必须返回一个值,但实际执行后没有需要返回的数据。 这时可以使用Void类型作为返回类型。

使用场景二:

通过反射获取所有返回值为void的方法。

public class Test {
  public void hello() { }
  public static void main(String args[]) {
    for (Method method : Test.class.getMethods()) {
      if (method.getReturnType().equals(Void.TYPE)) {
        System.out.println(method.getName());
      }
    }
  }
}

执行结果:

main
hello
wait
wait
wait
notify
notifyAll

ps:下面介绍java.lang.Void 与 void的比较及使用

void关键字表示函数没有返回结果,是java中的一个关键字。

java.lang.Void是一种类型。例如给Void引用赋值null。

Void nil = null;

通过Void类的代码可以看到,Void类型不可以继承与实例化。

public final
class Void {
  /**
   * The {@code Class} object representing the pseudo-type corresponding to
   * the keyword {@code void}.
   */
  @SuppressWarnings("unchecked")
  public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void");

  /*
   * The Void class cannot be instantiated.
   */
  private Void() {}
}

Void作为函数的返回结果表示函数返回null(除了null不能返回其它类型)。

 Void function(int a, int b) {
  //do something
  return null;
 }

在泛型出现之前,Void一般用于反射之中。例如,下面的代码打印返回类型为void的方法名。

public class Test {
  public void print(String v) {}
  public static void main(String args[]){
    for(Method method : Test.class.getMethods()) {
      if(method.getReturnType().equals(Void.TYPE)) {
        System.out.println(method.getName());
      }
    }
  }
}

泛型出现后,某些场景下会用到Void类型。例如Future<T>用来保存结果。Future的get方法会返回结果(类型为T)。

但如果操作并没有返回值呢?这种情况下就可以用Future<Void>表示。当调用get后结果计算完毕则返回后将会返回null。

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

因此当你使用泛型时函数并不需要返回结果或某个对象不需要值时候这是可以使用java.lang.Void类型表示。

总结

以上所述是小编给大家介绍的java.lang.Void的类 解析与使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • java.lang.Void 与 void的比较及使用方法介绍

    void不是函数,是方法的修饰符,void的意思是该方法没有返回值,意思就是方法只会运行方法中的语句,但是不返回任何东西. java.lang.Void是一种类型.例如给Void引用赋值null. Void nil = null; 通过Void类的代码可以看到,Void类型不可以继承与实例化. public final class Void { /** * The {@code Class} object representing the pseudo-type corresponding to

  • java.lang.Void类源码解析

    在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerException if the parent argument is {@code null} * @throws SecurityException if the current thread cannot create a * thread in the specified thread group. */ private static Void checkParentAcc

  • java.lang.Void类的解析与使用详解

    今天在查看源码的时候发现了 java.lang.Void 的类.这个有什么作用呢? 先通过源码查看下 package java.lang; /** * The {@code Void} class is an uninstantiable placeholder class to hold a * reference to the {@code Class} object representing the Java keyword * void. * * @author unascribed *

  • Java中BigDecimal类的add()的使用详解

    Java中的BigDecimal类的使用: 使用Java中的BigDecimal可以进行精确的计算,但是在使用BigDecimal时我们需要注意它的add()方法,使用它自身的add( )方法并不会改变它原始的值,因为初始化BigDecimal是创建一个了个对象,使用add()方法时也等于是创建了一个对象,若要保存这个对象需要再创建一个对象. 句法: public BigDecimal add(BigDecimal val); public BigDecimal add(BigDecimal v

  • Java语言class类用法及泛化(详解)

    这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象进行类型标识,也就是RTTI.这项信息记录了每个对象所属的类.虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类.Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建,具体内容介绍如下: 说白了就是: Class类也是类的一种,只是名字和class关键字高度相似.Java是大小写敏感的语言. Class类的对象内容是你创

  • Java使用Cipher类实现加密的过程详解

    一.先看一个简单加密,解密实现 1.1 加密 /** * content: 加密内容 * slatKey: 加密的盐,16位字符串 * vectorKey: 加密的向量,16位字符串 */ public String encrypt(String content, String slatKey, String vectorKey) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

  • 使用Java的Graphics类进行绘图的方法详解

    Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力.本节讲解Graphics类,下节讲解Graphics2D. Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形等. 1. 画线 在窗口画一条线段,可以使用Graphics类的drawLine()方法: drawLine(int x1,int y1,int x2,int y2) 例如,以下代码在点(3,3)与点(50,50)之间画线段,在点(100,10

  • Java使用Scanner类获取用户输入实例详解

    创建 Scanner 对象的基本语法: Scanner s = new Scanner(System.in); Scanner 类的 next() 方法 import java.util.Scanner; class Test{ public static void main(String[] args){ String s; Scanner userInput = new Scanner(System.in); System.out.print("Input String: ");

  • Java源码解析之TypeVariable详解

    TypeVariable,类型变量,描述类型,表示泛指任意或相关一类类型,也可以说狭义上的泛型(泛指某一类类型),一般用大写字母作为变量,比如K.V.E等. 源码 public interface TypeVariable<D extends GenericDeclaration> extends Type { //获得泛型的上限,若未明确声明上边界则默认为Object Type[] getBounds(); //获取声明该类型变量实体(即获得类.方法或构造器名) D getGenericDe

  • java.lang.String类的使用

    目录 一.String的用法 2.求字符串长度和某一位置字符 3.提取子串 4.字符串比较 5.字符串链接 6.字符串中单个字符查找 7.大小写转换 8.字符串中字符的替换 9.其他方法 10.类型转换 二.String特性 三.StringBuffer和StringBuiler 一.String的用法 String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.java把String类声明的final类,不能有子类.String类对象创建后不能修改

随机推荐