2011-12-15 64 views
70

Tôi không thể hiểu được văn bản sau ... Có nghĩa là <clinit> dành cho các nhà thầu trống không? Tại sao lại quan trọng để có hai phiên bản khác nhau?Java: Sự khác biệt giữa <init> và <clinit> là gì?

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html

2.9. Special Methods 

Ở cấp của máy ảo Java, mỗi nhà xây dựng (§2.12) xuất hiện như một phương pháp khởi dụ rằng có tên đặc biệt <init>. Tên này được cung cấp bởi trình biên dịch. Vì tên <init> không phải là số nhận dạng hợp lệ, nó không thể được sử dụng trực tiếp trong chương trình được viết bằng ngôn ngữ lập trình Java. Các phương thức khởi tạo có thể được gọi chỉ trong máy ảo của Java theo hướng dẫn không đặc biệt và chúng có thể được gọi chỉ trên các cá thể lớp chưa được khởi tạo. Một phương thức khởi tạo thể hiện nhận các quyền truy cập (§2.7.4) của hàm tạo từ đó nó được bắt nguồn.

Một lớp hoặc giao diện có tối đa một lớp hoặc phương thức khởi tạo giao diện và được khởi tạo (§2.17.4) bằng cách gọi phương thức . Phương thức khởi tạo của một lớp hoặc giao diện là tĩnh và không có đối số. Nó có tên đặc biệt <clinit>. Tên này là do trình biên dịch cung cấp. Vì tên <clinit> không phải là số nhận dạng hợp lệ , nó không thể được sử dụng trực tiếp trong chương trình được viết bằng ngôn ngữ lập trình Java . Các phương thức khởi tạo lớp và giao diện được gọi ngầm bởi máy ảo Java; chúng không bao giờ được gọi được gọi trực tiếp từ bất kỳ máy ảo Java inw2struction nào, nhưng chỉ được gọi gián tiếp như là một phần của quá trình khởi tạo lớp.

Trả lời

107

<init> là (hoặc một trong số) hàm tạo cho trường hợp và khởi tạo trường không tĩnh.

<clinit> là các khối khởi tạo tĩnh cho lớp và khởi tạo trường tĩnh.

class X { 

    static Log log = LogFactory.getLog(); // <clinit> 

    private int x = 1; // <init> 

    X(){ 
     // <init> 
    } 

    static { 
     // <clinit> 
    } 

} 
+2

gì 'CL' đứng cho? –

+9

Đoán của tôi là "lớp học". – Thilo

+2

@Thilo thật thú vị vì JVM xử lý định nghĩa lớp cũng như một loại đối tượng khác nữa. –

12

Sự khác biệt giữa <init><clinit><init> được sử dụng cho phương thức khởi tạo khởi tạo đối tượng đối tượng, trong khi <clinit> được sử dụng để khởi tạo đối tượng lớp. Ví dụ khởi tạo bất kỳ trường nào trong các trường cấp độ static được thực hiện trong <clinit> khi lớp được tải và initalised.

0

Chỉ cần thêm Nếu bạn sử dụng phương thức Class.forName, nó chỉ intializes lớp. Vì vậy, từ bên trong phương thức này, nó làm cho một cuộc gọi chỉ với clinit và khi bạn sử dụng newInstance trên đối tượng được trả về từ forName, nó sẽ gọi init cho khởi tạo cá thể. Bạn có thể sử dụng mã dưới đây để xem nó trong gỡ lỗi.

public class ByteCodeParent 
{ 
public static String name="ByteCode"; 
public ByteCodeParent() 
{ 
    System.out.println("In Constructor"); 
} 

static 
{ 
    System.out.println("In Static"); 
} 

{ 
    System.out.println("In Instance"); 
} 

Để kiểm tra, sử dụng

Class<ByteCodeParent> bcp2 =(Class<ByteCodeParent>) Class.forName("ByteCodeParent"); 
ByteCodeParent bcp4= bcp2.newInstance(); 
Các vấn đề liên quan