จากดู Java Static Variable Methods :
- เป็นตัวแปรที่เป็นของคลาสและไม่ใช่วัตถุ (อินสแตนซ์)
- ตัวแปรคงที่จะเริ่มต้นเพียงครั้งเดียวเมื่อเริ่มต้นการดำเนินการ ตัวแปรเหล่านี้จะเริ่มต้นก่อนการเริ่มต้นของตัวแปรอินสแตนซ์ใด ๆ
- สำเนาเดียวที่จะแชร์โดยอินสแตนซ์ทั้งหมดของชั้นเรียน
- ตัวแปรคงที่สามารถเข้าถึงได้โดยตรงจากชื่อคลาสและไม่ต้องการวัตถุใด ๆ
ตัวแปรอินสแตนซ์และคลาส (คงที่) จะเริ่มต้นเป็นค่าเริ่มต้นมาตรฐานโดยอัตโนมัติหากคุณไม่ได้ตั้งใจเตรียมใช้งาน แม้ว่าตัวแปรโลคัลจะไม่ถูกกำหนดค่าเริ่มต้นโดยอัตโนมัติ แต่คุณไม่สามารถคอมไพล์โปรแกรมที่ล้มเหลวในการเตรียมใช้งานตัวแปรโลคัลหรือกำหนดค่าให้กับตัวแปรโลคัลนั้นก่อนที่จะใช้
สิ่งที่คอมไพลเลอร์ทำคือการสร้างรูทีนการเริ่มต้นคลาสเดียวภายในที่รวมตัวเริ่มต้นตัวแปรแบบคงที่ทั้งหมดและบล็อกตัวเริ่มต้นแบบคงที่ทั้งหมดของโค้ดตามลำดับที่ปรากฏในการประกาศคลาส ขั้นตอนการเริ่มต้นเดี่ยวนี้จะรันโดยอัตโนมัติครั้งเดียวเท่านั้นเมื่อคลาสถูกโหลดครั้งแรก
ในกรณีของคลาสภายในพวกเขาไม่สามารถมีฟิลด์คงที่
ระดับชั้นstatic
เป็นชั้นซ้อนกันที่ไม่ชัดเจนหรือโดยปริยายประกาศ
...
คลาสภายในไม่สามารถประกาศตัวเริ่มต้นแบบคงที่ (§8.7) หรือส่วนต่อประสานสมาชิก ...
คลาสภายในไม่สามารถประกาศสมาชิกแบบคงที่เว้นแต่จะเป็นตัวแปรคงที่ ...
ดู JLS 8.1.3 Inner Classes และ Enclosing Instances
final
ฟิลด์ใน Java สามารถเริ่มต้นแยกต่างหากจากตำแหน่งการประกาศอย่างไรก็ตามไม่สามารถใช้กับstatic final
ฟิลด์ได้ ดูตัวอย่างด้านล่าง
final class Demo
{
private final int x;
private static final int z;
static
{
z = 10;
}
public Demo(int x)
{
this.x=x;
}
}
เนื่องจากมีเพียงสำเนาเดียวของstatic
ตัวแปรที่เชื่อมโยงกับประเภทแทนที่จะเชื่อมโยงกับแต่ละอินสแตนซ์ของประเภทเช่นเดียวกับตัวแปรอินสแตนซ์และหากเราพยายามเริ่มต้นz
ประเภทstatic final
ภายในตัวสร้างก็จะพยายามเริ่มต้นstatic final
ฟิลด์ประเภทใหม่z
เนื่องจากตัวสร้างถูกเรียกใช้ในแต่ละอินสแตนซ์ของคลาสที่ต้องไม่เกิดขึ้นกับfinal
ฟิลด์คงที่