Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

สามารถ Initialize Static Variable ใน Default Constructor ได้หรือไม่ใน Java?

คำตอบคือ ได้ แต่ไม่แนะนำ และมีข้อจำกัดสำคัญเมื่อรวมกับ 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

  1. Initialize ตอนประกาศ: static final int MAX = 100;
  2. 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 เท่านั้น