ในขณะที่ค้นหาข้อมูลจำเพาะภาษา Java เพื่อตอบคำถามนี้ฉันได้เรียนรู้สิ่งนั้น
ก่อนที่คลาสจะเริ่มต้นจะต้องเริ่มต้นคลาสซูเปอร์คลาสโดยตรงแต่อินเทอร์เฟซที่ใช้โดยคลาสจะไม่ถูกเตรียมใช้งาน ในทำนองเดียวกัน superinterfaces ของอินเทอร์เฟซจะไม่ถูกเตรียมใช้งานก่อนที่อินเทอร์เฟซจะเริ่มต้น
เพื่อความอยากรู้อยากเห็นของฉันเองฉันลองใช้แล้วและตามที่คาดไว้อินเทอร์เฟซInterfaceType
ไม่ได้เริ่มต้น
public class Example {
public static void main(String[] args) throws Exception {
InterfaceType foo = new InterfaceTypeImpl();
foo.method();
}
}
class InterfaceTypeImpl implements InterfaceType {
@Override
public void method() {
System.out.println("implemented method");
}
}
class ClassInitializer {
static {
System.out.println("static initializer");
}
}
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public void method();
}
โปรแกรมนี้พิมพ์
implemented method
อย่างไรก็ตามหากอินเทอร์เฟซประกาศdefault
วิธีการเริ่มต้นจะเกิดขึ้น พิจารณาInterfaceType
อินเทอร์เฟซที่ระบุเป็น
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
จากนั้นโปรแกรมเดียวกันด้านบนจะพิมพ์
static initializer
implemented method
กล่าวอีกนัยหนึ่งstatic
ฟิลด์ของอินเทอร์เฟซถูกเตรียมใช้งาน ( ขั้นตอนที่ 9 ในขั้นตอนการเริ่มต้นโดยละเอียด ) และตัวstatic
เริ่มต้นของชนิดที่กำลังเตรียมใช้งานจะถูกเรียก ซึ่งหมายความว่าอินเทอร์เฟซเริ่มต้นแล้ว
ฉันไม่พบสิ่งใดใน JLS เพื่อระบุว่าสิ่งนี้ควรเกิดขึ้น อย่าเข้าใจฉันผิดฉันเข้าใจว่าสิ่งนี้ควรเกิดขึ้นในกรณีที่คลาสการใช้งานไม่ได้จัดเตรียมการใช้งานสำหรับวิธีการนี้ แต่จะเป็นอย่างไร เงื่อนไขนี้หายไปจากข้อกำหนดภาษา Java ฉันพลาดอะไรไปหรือฉันตีความผิดหรือเปล่า