[code]public class Teste
{
public static void main(String[] args)
{
byte b = 2;
byte case1 = 1;
switch (b)
{
case case1+1:
System.out.println("case1");
break;
default :
System.out.println("default");
break;
}
}
}[/code]
Não compila, pois todo case a ser avaliado deve ser um número literal. Algo do tipo:
case 1 + 1: …
ou ainda:
case 1: …
Vai aí uma boa de switch, que compila. Qual será a saída do programa?
class Cruncher {
void crunch(int i) {
System.out.println("int version");
}
void crunch(String s) {
System.out.println("String version");
}
public static void main(String args[]) {
Cruncher crun = new Cruncher();
char ch = 'p';
crun.crunch(ch);
outer : for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
if (i == j) {
continue outer;
}
System.out.println("i = " + i + " j = " + j);
}
}
int j = 2;
switch (j) {
case 2 :
System.out.println("value is two");
case 2 + 1 :
System.out.println("value is three");
break;
default :
System.out.println("value is cccccc " + j);
break;
}
}
}
quando for i=0 e j=0 cai no continue e volta ao 1º for
depois imprime
i = 1 j = 0
e quando for i=1 e j=1 volta novamente ao 1º for e sai do loop
depois imprime
value is two
value is three // imprime isto porque case 2 : não tem um “break”
voltando a questão que eu postei… 
o que precisa ser feito para o código compilar? repare que foi definida uma variável com o nome “case1”…
Você deve definir case1 como final
:
final byte case1 = 1;
Assim o código compila não é? :?:
isto mesmo, as variáveis precisam ser final… 
e o tipo pode ser qualquer um que pode ser automaticamente convertido para int, (byte,char,short,int)
Sorry pela demora. Hoje estava meio ocupado com um trabalho para ser entregue na segunda. Daí olhei rapidinho o GUJ, mas não tive tempo de responder tudo.
A resposta correta como todos já sabem (depois de respondido fica fácil né?): “final”. Acredito que a variavel final seja tratada como um literal pelo compilador. O que acham ?
[]s, Welington B. Souza