ส่วนใน JLS สามารถพบได้: §12.4.2
ขั้นตอนการเริ่มต้นโดยละเอียด:
9. จากนั้นเรียกใช้ตัวเริ่มต้นตัวแปรคลาสและตัวเริ่มต้นแบบคงที่ของคลาสหรือตัวเริ่มต้นฟิลด์ของอินเทอร์เฟซตามลำดับข้อความราวกับว่าเป็นบล็อกเดียวยกเว้นว่าตัวแปรคลาสสุดท้ายและฟิลด์ของอินเทอร์เฟซที่รวบรวมค่า - ค่าคงที่เวลาเริ่มต้นก่อน
ดังนั้นตัวแปรคงที่สามตัวจะเริ่มต้นทีละตัวตามลำดับข้อความ
ดังนั้น
static A obj = new A();
//num1 = 1, num2 = 1;
static int num1;
//this is initilized first, see below.
static int num2=0;
//num1 = 1, num2 = 0;
หากฉันเปลี่ยนคำสั่งเป็น:
static int num1;
static int num2=0;
static A obj = new A();
ผลลัพธ์จะเป็น1,1
อย่างไร
โปรดทราบว่าstatic int num1;
ไม่ใช่ตัวแปรเริ่มต้นเนื่องจาก ( §8.3.2 ):
หากตัวประกาศฟิลด์มีตัวแปรเริ่มต้นแสดงว่ามีความหมายของการกำหนด (§15.26) ให้กับตัวแปรที่ประกาศและ: ถ้าตัวประกาศเป็นตัวแปรคลาส (นั่นคือฟิลด์คงที่) ตัวเริ่มต้นตัวแปรจะเป็น การประเมินและการมอบหมายจะดำเนินการครั้งเดียวเมื่อเริ่มต้นชั้นเรียน
และตัวแปรคลาสนี้จะถูกเตรียมใช้งานเมื่อสร้างคลาส สิ่งนี้เกิดขึ้นก่อน ( §4.12.5 )
ตัวแปรทุกตัวในโปรแกรมต้องมีค่าก่อนที่จะใช้ค่า: ตัวแปรคลาสตัวแปรอินสแตนซ์หรือส่วนประกอบอาร์เรย์แต่ละตัวจะเริ่มต้นด้วยค่าเริ่มต้นเมื่อสร้าง (§15.9, §15.10): สำหรับประเภทไบต์ค่าเริ่มต้น เป็นศูนย์นั่นคือค่าของ (ไบต์) 0 สำหรับ type short ค่าเริ่มต้นคือศูนย์นั่นคือค่าของ (short) 0 สำหรับประเภท int ค่าดีฟอลต์คือศูนย์นั่นคือ 0 สำหรับประเภท long ค่าดีฟอลต์คือศูนย์นั่นคือ 0L สำหรับประเภท float ค่าเริ่มต้นคือศูนย์บวกนั่นคือ 0.0f สำหรับชนิด double ค่าเริ่มต้นคือศูนย์บวกนั่นคือ 0.0d สำหรับประเภท char ค่าเริ่มต้นคืออักขระ null นั่นคือ '\ u0000' สำหรับประเภทบูลีนค่าดีฟอลต์คือเท็จ สำหรับการอ้างอิงทุกประเภท (§4.3) ค่าดีฟอลต์คือ null