Valor predeterminado de 'boolean' y 'Boolean' en Java

260

¿Cuáles son los valores predeterminados de boolean(primitivo) y Boolean(contenedor primitivo) en Java?

Makky
fuente

Respuestas:

511

El valor predeterminado para un Boolean(objeto) es null.
El valor predeterminado para a boolean(primitivo) es false.

Príncipe John Wesley
fuente
55
por favor agregue fuente oficial de enlace
muy
390

El valor predeterminado de cualquiera Object, como Boolean, es null.

El valor predeterminado para a booleanes falso.

Nota: Cada primitivo tiene una clase de contenedor. Cada contenedor utiliza una referencia que tiene un valor predeterminado de null. Las primitivas tienen diferentes valores predeterminados:

boolean -> false

byte, char, short, int, long -> 0

float, double -> 0.0

Nota (2): void tiene un contenedor Voidque también tiene un valor predeterminado nully es solo un valor posible (sin usar hacks).

Peter Lawrey
fuente
2
Creo que se puede mencionar Booleanes Object, que haría que la primera línea de significado obvio. Esto suena bastante básico, pero para alguien que hace una pregunta básica como esta puede ser útil.
Suma
23

booleano
puede ser trueo false.
El valor por defecto es false.

(Fuente: Variables primitivas de Java )

Booleano
Puede ser un Booleanobjeto que representa trueo false, o puede ser null.
El valor por defecto es null.

Bastardo
fuente
17

Si necesita preguntar, debe inicializar explícitamente sus campos / variables, porque si tiene que buscarlo, entonces es probable que alguien más tenga que hacerlo también.

El valor de una primitiva booleanes falso como se puede ver aquí .

Según lo mencionado por otros, el valor de a Booleanserá nulo por defecto.

Peter Tillemans
fuente
Gracias por referencia a la fuente oficial. En cuanto a la inicialización, no hay necesidad de compensar la falta de conocimiento.
LoBo
2
La 'falta de conocimiento' implica que hay algún nivel esperado para comparar. Si este nivel mínimo de conocimiento es claro, estoy de acuerdo. Si no, me parece prudente errar al ser más explícito. En general, esta es una decisión / opinión bastante personal / de equipo.
Peter Tillemans
44
@LoBo: creo que no hay nada de malo en compensar una posible falta de conocimiento. No sabe quién mantendrá su código en el futuro. Cualquier cosa que haga que su código sea más fácil de entender y / o legible, aunque tenga poco impacto en el rendimiento, solo puede ser algo bueno.
ferekdoley
9

Boolean es un objeto. Entonces, si es una variable de instancia, será nula. Si se declara dentro de un método, tendrá que inicializarlo, o habrá un error del compilador.

Si declaras como primitivo, es decir, booleano. El valor será falso por defecto si se trata de una variable de instancia (o variable de clase). Si se declara dentro de un método, aún tendrá que inicializarlo como verdadero o falso, o habrá un error del compilador.

planetjones
fuente
6

Un Booleanmiembro no inicializado (en realidad, una referencia a un objeto de tipo Boolean) tendrá el valor predeterminado de null.

Un booleanmiembro no inicializado (primitivo) tendrá el valor predeterminado de false.

codictorio
fuente
4

No hay valor predeterminado para Boolean. Booleandebe construirse con a booleano a String. Si el objeto no está inicializado, apuntaría a null.

El valor predeterminado de primitivo booleanes false.

http://download.oracle.com/javase/6/docs/api/java/lang/Boolean.html
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Rabino sigiloso
fuente
Creo que esos 3 votos negativos se deben a que usted dice "no hay incumplimiento", que es una declaración bastante poco clara. Como usted dice, un objeto de referencia no inicializado apunta a null. nulles el valor predeterminado, por lo que no estoy seguro de a qué se refiere cuando dice que no hay ninguno. (¿Quizás quisiste decir algo como " Booleanno es trueni falsepor defecto"?)
Radiodef
Sí, lo que pones es más preciso. Ya hay una respuesta aceptada que es más concisa. No estoy seguro de lo que se gana tanto al rechazar una publicación como a editarla.
Stealth Rabbi
1
Para aclarar, no voté en contra y mi edición no tenía ninguna relación con mi comentario. Recomiendo editar la respuesta si aprueba la frase sugerida, y luego podemos eliminar nuestros comentarios para limpiarlos.
Radiodef
1
class BooleanTester
{
    boolean primitive;
    Boolean object;

    public static void main(String[] args) {
        BooleanTester booleanTester = new BooleanTester();
        System.out.println("primitive: " + booleanTester.getPrimitive());
        System.out.println("object: " + booleanTester.getObject());
}

    public boolean getPrimitive() {
        return primitive;
    }

    public Boolean getObject() {
        return object;
    }
}

salida:

primitive: false
object: null

Esto parece obvio, pero tuve una situación en la que Jackson, mientras serializaba un objeto para JSON, estaba lanzando un NPE después de llamar a un getter, como este, que devuelve un booleano primitivo que no fue asignado. Esto me llevó a creer que Jackson estaba recibiendo un valor nulo e intentando llamar a un método, de ahí el NPE. Estaba equivocado.

La moraleja de la historia es que cuando Java asigna memoria para una primitiva, esa memoria tiene un valor incluso si no se inicializa, lo que Java equivale a falso para un booleano. Por el contrario, cuando asigna memoria para un objeto complejo no inicializado como un booleano, asigna solo espacio para una referencia a ese objeto, no el objeto en sí mismo (no hay ningún objeto en la memoria para hacer referencia), por lo que resolver esa referencia resulta nulo.

Creo que, estrictamente hablando, "el valor predeterminado es falso" está un poco fuera de lugar. Creo que Java no asigna la memoria ni le asigna un valor falso hasta que se establece explícitamente; Creo que Java asigna la memoria y cualquier valor que tenga esa memoria es el mismo que el valor de 'falso'. Pero a efectos prácticos son lo mismo.

perro serpiente
fuente