นี่คือโดยตรงจากhttp://www.programcreek.com/2011/10/java-class-instance-initializers/
1. คำสั่งดำเนินการ
ดูคลาสต่อไปนี้คุณรู้หรือไม่ว่าอันไหนที่ถูกประหารชีวิตก่อน?
public class Foo {
//instance variable initializer
String s = "abc";
//constructor
public Foo() {
System.out.println("constructor called");
}
//static initializer
static {
System.out.println("static initializer called");
}
//instance initializer
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Foo();
new Foo();
}
}
เอาท์พุท:
initializer คงที่เรียกว่า
เริ่มต้นอินสแตนซ์ที่เรียกว่า
คอนสตรัคที่เรียกว่า
เริ่มต้นอินสแตนซ์ที่เรียกว่า
คอนสตรัคที่เรียกว่า
2. initializer ของอินสแตนซ์ Java ทำงานอย่างไร
initializer อินสแตนซ์ด้านบนมีคำสั่ง println b = 0
เพื่อให้เข้าใจถึงวิธีการทำงานเราสามารถรักษามันเป็นคำสั่งที่กำหนดตัวแปรเช่น สิ่งนี้สามารถทำให้เข้าใจได้ชัดเจนยิ่งขึ้น
แทน
int b = 0
คุณสามารถเขียน
int b;
b = 0;
ดังนั้นการเริ่มต้นอินสแตนซ์และตัวแปรเริ่มต้นของอินสแตนซ์จะเหมือนกันมาก
3. initializers อินสแตนซ์มีประโยชน์เมื่อใด
การใช้อินสแตนซ์ initializers นั้นหายาก แต่ก็ยังเป็นทางเลือกที่มีประโยชน์สำหรับอินสแตนซ์ตัวแปร initializers หาก:
- รหัส Initializer ต้องจัดการกับข้อยกเว้น
- ทำการคำนวณที่ไม่สามารถแสดงพร้อมกับ initializer ตัวแปรอินสแตนซ์
แน่นอนรหัสดังกล่าวสามารถเขียนในการก่อสร้าง แต่ถ้าคลาสมีคอนสตรัคเตอร์หลายตัวคุณจะต้องทำซ้ำรหัสในคอนสตรัคเตอร์แต่ละตัว
ด้วย initializer อินสแตนซ์คุณสามารถเขียนโค้ดเพียงครั้งเดียวและมันจะถูกดำเนินการไม่ว่าตัวสร้างใดที่จะใช้ในการสร้างวัตถุ (ฉันเดาว่านี่เป็นเพียงแนวคิดและไม่ได้ใช้บ่อย)
อีกกรณีที่อินสแตนซ์ initializers นั้นมีประโยชน์คือคลาสภายในที่ไม่ระบุชื่อซึ่งไม่สามารถประกาศตัวสร้างใด ๆ ได้เลย (นี่จะเป็นสถานที่ที่ดีในการวางฟังก์ชั่นการบันทึกหรือไม่)
ขอบคุณ Derhein
โปรดทราบด้วยว่าคลาส Anonymous ที่ใช้อินเตอร์เฟส [1] ไม่มี Constructor ดังนั้นจำเป็นต้องมี initializers อินสแตนซ์เพื่อดำเนินการนิพจน์ทุกชนิดที่เวลาก่อสร้าง
public static void staticMethod(){}
TestStatic.class.getMethod("staticMethod");
ตัวเริ่มต้นคงที่จะไม่ถูกเรียกใช้ ข้อมูลเพิ่มเติมที่นี่docs.oracle.com/javase/specs/jvms/se10/html/…