2015-10-20 11 views
6

Vâng, tôi đã có một mã số ví dụ:Khi lớp học được tải?

public class Main { 
    public static void main(String[] args) { 
     Test t; //1 
     Integer i = new Integer(1); //2 
     t = new Test(); //3 
     System.out.println(Test4.a); //4 
    } 
} 

class Test { 
    private int a = 10; 
    private Test2 t2; //5 

    List<Test2> list = new ArrayList<Test2>() { 
     { 
      for (int i = 0; i < a; i++) { 
       add(new Test2()); //6 
      } 
     } 
    }; 
} 

class Test2 extends Test3{ 
} 

class Test3 { 
} 

class Test4 { 
    public static final int a = 4; 
} 

Tôi không biết làm thế nào (toàn bộ hoặc một phần) và khi các lớp được nạp. Vì vậy:

  1. Test t; - nó không phải là hoạt động sử dụng, nhưng tham chiếu t phải là loại nhất định. Đã được thử nghiệm lớp nạp (có thể một phần, sau đó bao nhiêu giai đoạn - tải \ linking \ initializing - nó được thông qua) hoặc không có gì xảy ra?
  2. Integer i = new Integer(1); - là Số nguyên được tải khi JVM bắt đầu hoặc trên dòng này?
  3. t = new Test(); - mức sử dụng đang hoạt động. Nó đã được tải hoàn toàn ngay từ đầu hoặc từ một số điểm (xem 1)
  4. System.out.println(Test4.a); - là Test4 được tải hay không?
  5. Đã Test2Test3 có được tải hay không? Nếu có thì khi nào?

Trả lời

5

Khi lớp học được tải được bao phủ bởi JLS, Section 12.4.1.

Một lớp học hoặc giao diện kiểu T sẽ được khởi tạo ngay trước khi sự xuất hiện đầu tiên của bất kỳ một trong các cách sau:

  • T là một lớp và một thể hiện của T được tạo ra.

  • T là một lớp và phương thức tĩnh được khai báo bởi T được gọi.

  • Trường tĩnh được khai báo bằng T được gán.

  • Trường tĩnh được khai báo bằng T được sử dụng và trường không phải là biến không đổi (§4.12.4).

  • T là một lớp cấp cao nhất (§7.6), và một câu lệnh khẳng định (§14.10) được lồng vào bên trong T (§8.1.3) được thực thi.

(snip)

Một lớp học hoặc giao diện sẽ không được khởi tạo trong bất kỳ hoàn cảnh nào khác.

Chapter 5 nói về tải, liên kết và khởi tạo lớp học.

Máy ảo Java tự động tải, liên kết và khởi tạo lớp và giao diện. Đang tải là quá trình tìm biểu diễn nhị phân của một lớp hoặc loại giao diện với một tên cụ thể và tạo một lớp hoặc giao diện từ biểu diễn nhị phân đó. Liên kết là quá trình lấy một lớp hoặc giao diện và kết hợp nó vào trạng thái thời gian chạy của Máy ảo Java để nó có thể được thực thi. Việc khởi tạo một lớp hoặc giao diện bao gồm việc thực hiện phương thức khởi tạo lớp hoặc phương thức khởi tạo giao diện (§2.9).

câu hỏi của bạn:

  1. Khai báo một biến không tải lớp. Nhưng việc tải xảy ra trước khi liên kết và liên kết xảy ra trước khi khởi tạo. Vì vậy, khi một lớp được tải, nó cũng sau đó được liên kết và khởi tạo.
  2. Lớp Integer được nạp bởi JVM (cùng với nhiều lớp nền tảng ngôn ngữ khác) trước khi mã của bạn chạy.
  3. Bây giờ, lớp Test được tải, vì một phiên bản mới được tạo.
  4. Test4 không được tải vì chỉ sử dụng biến cố định, xung đột với quy tắc thứ 4 ở trên.
  5. Test3Test2 được nạp sau khi Test đã được nạp, vì Test2 đối tượng được tạo ra trong trường hợp initializer Test 's, mà cũng gây ra Test3 (lớp cha) để được nạp.

Điều này được xác nhận khi running your code with the JVM option -verbose:class.

+0

Lưu ý rằng việc khởi tạo không giống như tải (hoặc liên kết). –

+0

Nếu lớp ** Test ** không được tải ở dòng (1) thì loại nào sẽ có ** t ** thay đổi? –

+0

Trong JVM, biến 't' sẽ không tồn tại; nó chưa được phân bổ. – rgettman

Các vấn đề liên quan