2016-05-19 16 views
5

Tôi nhầm lẫn với đầu ra của mã bên dưới. Tôi biết khối tĩnh đầu tiên được thực hiện sau khi tải lớp nhưng tại sao lớp Test6 của tôi không được tải. Ai đó có thể làm rõ.Tại sao lớp học của tôi không được tải

package com.vikash.General; 

public class Test5 { 

    public static void main(String[] args) { 
     System.out.println(Test6.FOO); 
    } 
    static { 
     System.out.println("Initializing B"); 
    } 
} 
class Test6{ 

    public static final String FOO = "foo"; 
    static { 
     System.out.println("Initializing A"); 
    } 
} 
+0

Tôi đang nhận được o/p Khởi tạo B foo –

Trả lời

0

Sử dụng một bộ nạp lớp bạn sẽ nhận được kết quả mong muốn

Class.forName("<package>.Test6"); 
+0

Tại sao không chỉ 'Class foo = Test6.class'? – Thilo

+1

mọi thứ sẽ hoạt động. Tôi chỉ cho nó như OP đã nhầm lẫn về vấn đề tải lớp. – Helios

+0

Không thực sự. Một biểu thức như 'System.out.println (Test6.FOO)' bình thường cũng sẽ tải lớp (nhưng không phải trong trường hợp này). – Thilo

2

Nó có vẻ là vì trình biên dịch được nội tuyến tham chiếu đến chuỗi chữ "foo", vì vậy JRE không thực sự bận tâm tải Test6 để tải xuống.

Nếu bạn thực hiện một sự thay đổi như:

public static final String FOO = new String("foo"); 

sau đó lớp Test6 không được nạp (và khối static của nó được thực hiện).

+0

Nó cũng hoạt động với một chữ khi 'FOO' không phải là cuối cùng. Nhưng trong trường hợp nó nên được, giải pháp của bạn hoạt động như là tốt. – Clayn

9

Test6.FOO đề cập đến Test6, nhưng lĩnh vực này là một public static final String khởi tạo từ một thời gian biên dịch liên tục, vì vậy nó will be inlined by the compiler, và Test6 không cần phải được nạp ở tất cả.

+0

Thật vậy. Khi loại bỏ 'final', bộ phận initalizer tĩnh sẽ được gọi – Clayn

+0

@Thilo Bạn có thể giải thích" nó sẽ được biên dịch bởi trình biên dịch "hay không. Tôi không thể hiểu. Điều này là mới đối với tôi – mubeen

+1

Trong thực tế, mã sẽ trở thành 'System.out.println (" foo ")'. Trình biên dịch thay thế tham chiếu đến trường bằng chuỗi ký tự. Khi chạy, 'Test6' không cần thiết cho dòng mã này. – Thilo

-3

Test6 không được khởi tạo.

foo là tĩnh, có nghĩa là nó có thể được sử dụng trước khi lớp được intitialized và sau khi một lớp được tải.

+3

Tôi không biết nếu tôi hiểu câu trả lời này hoàn toàn, nhưng tôi khá chắc chắn nó sai và không trả lời câu hỏi. – SomeJavaGuy

+0

Nếu bạn không hiểu, tại sao bạn chắc chắn nó sai? – sotondolphin

+0

vì nó không giải thích tại sao 'Test6' không được tải. Nó chỉ được theo sau bởi một lời giải thích khó hiểu của 'foo là tĩnh', mà tại thời điểm này không liên quan đến hành vi. Trên thực tế đây là câu hỏi, mặc dù 'foo' beeing' static', tại sao nó không tải 'Test6' và do đó gọi là' static initializer block' – SomeJavaGuy

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