quebrar e mudar aparece para executar todas as declarações de caso

No release estável mais recente do Java e do Eclipse (Kempler), insira o código a seguir e execute-o, assumindo que os nomes de pacote e classe existam:

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);
    }
}

Isso imprime o valor 4. Originalmente, eu pensei que deveria imprimir 2 porque eu pensei que, mesmo se não houvesse instruções de quebra, cada pedaço de código ainda é mantido em uma declaração de caso. Agora eu acho que a questão está em como ela é compilada. Por exemplo, minha crença atual é que, internamente, um booleano monitora se uma declaração de caso é igual ou não ao valor. Se foi, então o booleano é verdadeiro etodas as declarações de caso serão tratadas como verdadeiras até que uma pausa seja encontrada. Isso faz sentido, mas ainda estou me perguntando se há outras razões por trás disso, ou se estou completamente errado em minha suposição.

questionAnswers(4)

yourAnswerToTheQuestion