2014-11-20 22 views
5

prega di dare un'occhiata al di sotto esempio Non riesco a capire la relazione tra char e bytechar e byte con modificatore di accesso finale - java

byte b = 1; 
char c = 2; 

c = b; // line 1 

Dammi compilazione errore perché c è il tipo di char e B è il tipo di byte così colata è mosto in tale condizione

ma ora la Tweest ecco quando ho eseguito sotto codice

final byte b = 1; 
char c = 2; 

c = b; // line 2 

l ine 2 compila con successo non ha bisogno di alcuna fusione affatto quindi la mia domanda è: perché char C comportarsi diverso quando uso modificatore di accesso finale con byte

risposta

11

Perché qualificazione con final rende la variabile una variabile costante, che è un constant expression. Così

final byte b = 1; 
char c = 2; 

c = b; // line 2 

diventa realtà

final byte b = 1; 
char c = 2; 

c = 1; 

e il compilatore ha una garanzia che il valore 1 può andare bene in una variabile char.

Con una variabile non costante byte, non esiste tale garanzia. byte is signed, char is unsigned.

+0

grazie gotach punto :) –

1

Immagino che ciò accada perché il compilatore java sostituisce i riferimenti alle variabili final con i loro valori (quasi come il pre-processore in C). Dal momento che il valore 1 è legale per il tipo di char l'ultima linea si trasforma in

c = 1; 

che viene compilato con successo.

+0

'variabili final' con espressioni costanti. cioè'byte a = 1; finale b = a; char c = b; 'fallisce ancora. – weston

2

Si esegue in JLS-5.1.4 Widening and Narrowing Primitive Conversion,

Il seguente conversione combina entrambi allargamento e restringimento conversioni primitive:

  • byte to char

Innanzitutto, il byte viene convertito in un int tramite ampliamento della conversione primitiva (§5.1.2) e quindi del resul ting int viene convertito in char restringendo la conversione primitiva (§5.1.3).

final byte b = 1; 
char c = (char) ((int) 2); // <-- 2 is an int literal 
c = (char) ((int) 1); // <-- b is 1 a byte literal 

Se si esaminano i bytescodes con javap -v vedrete il valore 1 ha già sostituito la variabile b dopo la compilazione.

public static void main(java.lang.String[]) throws java.lang.Exception; 
    descriptor: ([Ljava/lang/String;)V 
    flags: ACC_PUBLIC, ACC_STATIC 
    Exceptions: 
    throws java.lang.Exception 
    Code: 
    stack=2, locals=3, args_size=1 
     0: iconst_1 
     1: istore_1 // b = 1 
     2: iconst_2 
     3: istore_2 // c = 2 
     4: iconst_1 // integer1. 
     5: istore_2 // c = 1. 
Problemi correlati