Interrumpir y cambiar parece ejecutar todas las declaraciones de caso

En la última versión estable de Java y Eclipse (Kempler), ingrese el siguiente código y ejecútelo, asumiendo que los nombres de paquete y clase existen:

package some_package;

public class what_the_heck {

    public static void main(String[] args) {
        int p = 2;
        int x = 1;
        switch(p){  
            case (1):
                x--;
            case (2):
                x = 2;
            case (3):
                x = 3;
            default:
                x++;
        }
        System.out.println(x);
    }
}

Esto imprime el valor 4. Originalmente, pensé que debería imprimir 2 porque pensé que incluso si no hubiera declaraciones de ruptura, cada pieza de código todavía se conserva en una declaración de caso. Ahora creo que el problema radica en cómo se compila. Por ejemplo, mi creencia actual es que internamente un booleano realiza un seguimiento de si una declaración de caso era o no igual al valor. Si lo fue, entonces el booleano es verdadero yTodas las declaraciones de casos serán tratadas como verdaderas. hasta que se encuentra un descanso. Esto tiene sentido, pero todavía me pregunto si hay otras razones detrás de esto, o si estoy completamente equivocado en mi suposición.

Respuestas a la pregunta(4)

Su respuesta a la pregunta