Diferencia entre void y Void en Java
El tipo java.lang.Void
es análogo al java.lang.Integer
. El Void
envuelve void
y extiende la clase de objeto, y void
no tiene ningún valor posible, lo que hace que java.lang.Void
no sea instanciable.
Nuestro objetivo es encontrar y comprender la diferencia entre Void
y void
en la programación Java. También aprenderemos cómo y dónde podemos usar Void
o void
en la programación Java.
Diferencia entre void
y Void
en Java
La diferencia básica entre ambos (Void
& void
) es que void
es un tipo primitivo mientras que Void
, un tipo de referencia que hereda del Object
. Aunque ninguno de ellos tiene valores posibles, ambos son de diferentes tipos.
El void
(todo en minúsculas) es el tipo impropio que se utiliza para referirse a la ausencia del valor. Debido a que no tiene ningún valor identificable, void
significa que una función o método no devolverá ningún valor.
Por otro lado, java.lang.Void
devuelve el objeto, podemos devolver null
para hacer las cosas de forma legal, y es la única forma de hacerlo. No es instanciable porque tiene un constructor privado al que no se puede acceder desde el exterior.
Usa el void
y Void
en Java
Usamos void
(todo en minúsculas) cuando queremos que un método no devuelva ningún valor. Como en el siguiente ejemplo, el método printMessage()
no devuelve nada sino que imprime un mensaje en pantalla.
Código de ejemplo para void
(Main.java
):
public class Main {
static void printMessage() {
System.out.println("printMessage function just got executed!");
}
public static void main(String[] args) {
printMessage();
}
}
Podemos usar Void
(la primera letra en mayúscula) mientras hacemos la reflexión en la programación de Java porque hay algunas situaciones en las que necesitamos presentar la palabra clave void
como el objeto.
Al mismo tiempo, no se nos permite crear el objeto de la clase Void
, y por eso su constructor es privado y no se puede acceder desde el exterior.
Además, no podemos heredar la clase Void
porque es una clase final
. Esto nos lleva a usar Void
en la reflexión, donde obtenemos el tipo de retorno de un método como void
.
Código de ejemplo para Void
(Main.java
):
public class Main {
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
Class c1 = TestOne.class.getMethod("Test", (Class<?>[]) null).getReturnType();
System.out.println(c1 == Void.TYPE); // true
System.out.println(c1 == Void.class); // false
}
}
Código de ejemplo para Void
(TestOne.java
):
class TestOne {
public void Test() {}
}
Producción :
True
False
También podemos obtener el tipo de retorno de un método como void
con genéricos. Queremos escribir el código para una clase genérica que pueda devolver void por algo.
abstract class Foo<T> {
abstract T bar();
}
class Bar extends Foo<Void> {
Void bar() {
return (null);
}
}
Producción :
True
False