2014-11-20 14 views
5

Proszę spojrzeć na poniższy przykład nie mogę zrozumieć relację pomiędzy char i bajtchar i bajt z końcowym modyfikatora dostępu - java

byte b = 1; 
char c = 2; 

c = b; // line 1 

Daj mi kompilacji błąd ponieważ C jest rodzajem char i b jest rodzajem byte tak odlewania jest koniecznością w takim stanie

ale teraz Tweest tu jest, gdy biegnę poniżej kod

final byte b = 1; 
char c = 2; 

c = b; // line 2 

l ine 2 skompilować powodzeniem nie potrzeba żadnego odlew w ogóle więc moje pytanie brzmi: dlaczego char c zachowują się inaczej, gdy używam ostateczny modyfikator dostępu z byte

Odpowiedz

11

powodu zakwalifikowania go final sprawia zmiennej zmienna stała, która jest constant expression. Więc

final byte b = 1; 
char c = 2; 

c = b; // line 2 

rzeczywiście staje

final byte b = 1; 
char c = 2; 

c = 1; 

i kompilator ma gwarancję, że wartość 1 może zmieścić się w zmiennej char.

Przy zmiennej niestałej byte, nie ma takiej gwarancji. byte is signed, char is unsigned.

+0

dzięki gotach punkt :) –

1

Przypuszczam, że tak się dzieje, ponieważ kompilator java zastępuje odwołania do zmiennych final przez ich wartości (prawie jak preprocesor w C). Ponieważ wartość 1 jest legalny na typ char ostatnia linia jest przekształcany do

c = 1; 

że jest kompilowany pomyślnie.

+0

'zmienne final' ze stałych wyrażeń. to znaczy'bajt a = 1; końcowy b = a; char c = b; 'nadal się nie udaje. – weston

2

Używasz do JLS-5.1.4 Widening and Narrowing Primitive Conversion,

Poniższy konwersja łączy zarówno rozszerzenie i zwężenie prymitywne konwersji:

  • byte to char

pierwsze, byte jest przekształcany do int poprzez poszerzenie prymitywnej konwersji (§5.1.2), a następnie resul ting int jest konwertowany na char przez zawężenie konwersji pierwotnej (§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 

Jeśli zbadać bytescodes z javap -v zobaczysz wartość 1 został już zastąpiony zmienną b po kompilacji.

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. 
Powiązane problemy