簡體   English   中英

最終變量和編譯時常量之間的差異

[英]Difference between final variables and compile time constant

最終變量和編譯時常量之間有什么區別?

請考慮以下代碼

final int a = 5;
final int b;
b=6;
int x=0;
switch(x)
{
     case a: //no error
     case b: //compiler error
}

這是什么意思? 何時以及如何為最終變量賦值? 運行時會發生什么以及編譯時會發生什么? 我們為什么要給switch一個編譯時常量? java的其他結構需要編譯時間常量?

問題是, 所有case:語句必須在編譯時是最終的 你的第一個陳述是終極的 100% a遺囑不是5以外的其他價值。

final int a = 5;

但是, b 不保證這一點。 如果b周圍會有if語句怎么辦?

final int b;
if(something())
   b=6;
else
   b=5;

這是什么意思?

這意味着'b'不是編譯時常量表達式,而JLS要求它。

何時以及如何為最終變量賦值?

正式地,當執行賦值語句或初始化程序時。

但實際上,如果final聲明了編譯時常量,則表達式在編譯時進行計算,並將其值硬連接到代碼中。

運行時會發生什么以及編譯時會發生什么?

往上看。

我們為什么要給switch一個編譯時常量?

因為JLS 需要它。

字節碼編譯器必須檢查switch語句是否格式正確; 即開關常數的值不會發生碰撞。 它還允許JIT編譯器生成針對開關常量的實際值進行優化的代碼。

java的其他結構需要編譯時間常量?

沒有我能想到的,在我的頭腦中。

從編譯器的角度來看,您正在嘗試使用可能未初始化的變量b。 switch語句被編譯成JVM字節碼tableswitch或lookupswitch ,它要求case語句中使用的值都是編譯時常量和唯一的。

final int a = 4; // compiler is sure a is initialized
final int b;// variable b is not guranted to be assigned

雖然這個語句最終會初始化b,但編譯器無法檢測到它。

if (a < 4) b= 10;
if (a >= 4) b = 8

switch語句需要一個常量。 由於最終變量可以被延遲初始化,並且編譯器無法確定b它在case分支中具有值。

final int b; 可以分配一次,值不確定,將根據條件在運行時決定。 這就是原因,即使它是一個最終變量,它也不是COMPILE TIME常量,盡管它將是一個RUN TIME常量,並且case需要編譯時常量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM