Variaveis final

10 respostas
derheimen

Quando se declara as variaveis s1 e c1 com o modificador final, é possível adicioar em um tipo byte, como no exemplo abaixo.

final short s1 = 1; final char c1 = 1; byte b1 = s1; byte b2 = c1;
Mas se for removido o modificador final, o código não compila.
Alguém poderia me explicar ?

10 Respostas

_Renatu

Não compila, e te retorna qual erro?

T

Isto compila:

final short s1 = 1;
 final char c1 = 1;
 byte b1 = s1;
 byte b2 = c1;

Mas isto não compila:

final short s1 = 1234;
 final char c1 = '\u1234';
 byte b1 = s1;
 byte b2 = c1;

A razão é que no primeiro trecho de código, o compilador sabe que o valor cabe exatamente em um byte (porque s1 e c1 são constantes). No segundo trecho de código, o valor não cabe em um byte, e não pode ser compilado.

derheimen

Este código que eu adicionei acima, compila!!!
Se as duas primeiras variaveis locais estiverem marcados com “final”.
Se remover o modificador final dessas variaveis não compila.
Agora porque não compila que gostaria de saber, não consegui entender.

derheimen

Olha aqui a descrição do problema:

shison

Acho que a resposta do seu problema está na post do thingol.

derheimen

Existe essa possibilidade, mas o que estou querendo saber é outra coisa.
Isso não compila!!!

short s1 = 1; char c1 = 1; byte b1 = s1; byte b2 = c1;
Se a variavel usada para atribuição for declarada como final(s1 e c1), é realizada uma conversão implicitamente, para b1 e b2, por isso funciona.

T

qual é o modificador de acesso da classe?

só por curiosidade!

^^

derheimen

public
Pq?

T

Heider Matos:
Isso não compila!!!

short s1 = 1; char c1 = 1; byte b1 = s1; byte b2 = c1;

De fato, o compilador não é esperto suficientemente para determinar que entre “short s1 = 1” e “byte b1 = s1” o valor de s1 não varia (já que é uma variável local, não uma variável de instância que poderia ser modificada externamente por uma thread) e portanto poderia ser considerado igual a 1, ou seja, caberia em um byte.
Ele acha que, quando chega à linha “b1 = s1”, o valor de s1 pode ser qualquer, inclusive um que excede o tamanho de um byte.
Isso poderia ser resolvido com análise de fluxo, mas acho que, para não complicar mais ainda a definição da linguagem, resolveram rejeitar a conversão implícita neste caso.

LPJava

so para completar… qdo vc poe final eh constante o valor nao sofre alteração… entao por isso compila… mais qdo vc tira é o que thingol falou acima… as palavras dele é a solução para a sua duvida heeh!!

Criado 23 de janeiro de 2007
Ultima resposta 23 de jan. de 2007
Respostas 10
Participantes 6