其他
面试官:说说Java中java.lang.Void和void有什么作用和区别?
前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考。
来源:https://dwz.cn/FH6H1pjb
上图是我最近在Stackoverflow上面看到这个问题,觉得很有意思,与大家分享一下。
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 用来保存结果。Future 的 get 方法会返回结果(类型为 T )。
但如果操作并没有返回值呢?这种情况下就可以用 Future 表示。当调用 get 后结果计算完毕则返回后将会返回 null。
另外 Void 也用于无值的 Map 中,例如 Map<T,Void> 这样 map 将具 Set 有一样的功能。
因此当你使用泛型时函数并不需要返回结果或某个对象不需要值时候这是可以使用 java.lang.Void 类型表示。
望知晓:由于群里面国内外大厂的大佬比较多,为了保持群的质量,目前不准备再拉新同学进群了,水群的人员一律永久拉黑,望理解。
热文推荐
动图看1997~2019年《世界最有价值公司Top10排名》的变迁史