คำตอบคือ ได้ แต่ไม่แนะนำ และมีข้อจำกัดสำคัญเมื่อรวมกับ final
Static Variable พื้นฐาน
- เป็นของ Class ไม่ใช่ Object
- โหลดตอน Class Loading (Compile-time)
- มีเพียง 1 Copy ทั้งโปรแกรม
- เข้าถึงได้โดยไม่ต้อง new Object
ตัวอย่าง: Initialize ใน Constructor (ทำได้)
public class StaticInitExample {
static String name;
static int age;
// Default Constructor
public StaticInitExample() {
name = "Krishna";
age = 25;
}
public static void main(String args[]) {
new StaticInitExample(); // เรียก Constructor เพื่อ init
System.out.println(StaticInitExample.name); // Krishna
System.out.println(StaticInitExample.age); // 25
}
}
ผลลัพธ์
Krishna 25
กรณี static final - Initialize ใน Constructor ไม่ได้
public class StaticFinalExample {
static final String name;
static final int age;
// พยายาม init ใน Constructor -> Compile Error
public StaticFinalExample() {
name = "Krishna"; // Error: cannot assign a value to final variable
age = 25; // Error: cannot assign a value to final variable
}
}
Compile-time Error
StaticFinalExample.java:5: error: cannot assign a value to final variable name
name = "Krishna";
^
StaticFinalExample.java:6: error: cannot assign a value to final variable age
age = 25;
^
วิธีที่ถูกต้องสำหรับ static final
- Initialize ตอนประกาศ:
static final int MAX = 100; - Static Block:
static final int MAX; static { MAX = 100; // OK }
เหตุผล
static final ถูกจัดว่าเป็น Constant ต้องกำหนดค่าก่อนที่ Class Initialization เสร็จ Constructor รันหลัง Class Initialization แล้ว จึงถือว่า "Reassign" ซึ่งห้ามสำหรับ final
สรุป
staticธรรมดา -> Init ใน Constructor ได้ (แต่ไม่แนะนำ ควรใช้ Static Block)static final-> ห้าม Init ใน Constructor ต้อง Init ตอนประกาศหรือ Static Block เท่านั้น