Bir değişkeni bildirmek finalveya bildirmemek final, ancak etkin bir şekilde nihai tutmak farklı bir bayt koduyla sonuçlanabilir (derleyiciye bağlıdır).
Küçük bir örneğe bakalım:
public static void main(String[] args) {
final boolean i = true; // 6 // final by declaration
boolean j = true; // 7 // effectively final
if (i) { // 9
System.out.println(i);// 10
}
if (!i) { // 12
System.out.println(i);// 13
}
if (j) { // 15
System.out.println(j);// 16
}
if (!j) { // 18
System.out.println(j);// 19
}
}
mainYöntemin karşılık gelen bayt kodu ( Windows 64 Bit'te Java 8u161):
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iconst_1
3: istore_2
4: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
7: iconst_1
8: invokevirtual #22 // Method java/io/PrintStream.println:(Z)V
11: iload_2
12: ifeq 22
15: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
18: iload_2
19: invokevirtual #22 // Method java/io/PrintStream.println:(Z)V
22: iload_2
23: ifne 33
26: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
29: iload_2
30: invokevirtual #22 // Method java/io/PrintStream.println:(Z)V
33: return
İlgili satır numarası tablosu:
LineNumberTable:
line 6: 0
line 7: 2
line 10: 4
line 15: 11
line 16: 15
line 18: 22
line 19: 26
line 21: 33
Biz çizgilerine kaynak kodunu görmek üzere 12, 13, 14bayt kodu görünmüyor. Çünkü iolduğunu trueve 's durumunu değiştirmeyecektir. Böylece bu koda ulaşılamaz (bu cevapta daha fazla ). Aynı nedenden dolayı satırdaki kod da 9özlüyor. Kesin iolduğu trueiçin durumunun değerlendirilmesi gerekmez .
Değişken olsa Öte yandan jise etkili bir nihai aynı şekilde işlenir değil. Uygulanan böyle bir optimizasyon yoktur. Durumu jiki kez ölçüldü. Bayt kodu, etkin bir şekilde nihaij olmasına bakılmaksızın aynıdır .