Trong khi tìm kiếm thông qua Đặc tả ngôn ngữ Java để trả lời câu hỏi này , tôi đã học được rằng
Trước khi một lớp được khởi tạo, lớp cha trực tiếp của nó phải được khởi tạo, nhưng các giao diện do lớp thực hiện sẽ không được khởi tạo. Tương tự, các siêu giao diện của một giao diện không được khởi tạo trước khi giao diện được khởi tạo.
Vì sự tò mò của riêng tôi, tôi đã thử nó và như mong đợi, giao diện InterfaceType
không được khởi tạo.
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();
}
Chương trình này in
implemented method
Tuy nhiên, nếu giao diện khai báo một default
phương thức, thì quá trình khởi tạo sẽ xảy ra. Hãy xem xét InterfaceType
giao diện được đưa ra là
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
thì chương trình tương tự ở trên sẽ in
static initializer
implemented method
Nói cách khác, static
trường của giao diện được khởi tạo ( bước 9 trong Quy trình khởi tạo chi tiết ) và trình static
khởi tạo của kiểu đang được khởi tạo được thực thi. Điều này có nghĩa là giao diện đã được khởi tạo.
Tôi không thể tìm thấy bất kỳ điều gì trong JLS để chỉ ra rằng điều này sẽ xảy ra. Đừng hiểu sai ý tôi, tôi hiểu rằng điều này sẽ xảy ra trong trường hợp lớp thực thi không cung cấp triển khai cho phương thức, nhưng nếu nó xảy ra thì sao? Điều kiện này có bị thiếu trong Đặc tả ngôn ngữ Java không, tôi có bỏ sót điều gì không, hay tôi diễn giải sai?
interface
trong Java không nên xác định bất kỳ phương thức cụ thể nào. Vì vậy, tôi ngạc nhiên rằng InterfaceType
mã đã được biên dịch.