[英]What is the difference between constant variables and final variables in java?
[英]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.