2012-08-08 46 views
8

Ở đây tôi đã làm một chương trình khi tôi in các constant trong mainstatic khối không thực thi .. nhưng khi tôi in stat mà thực hiện là có bất kỳ trọng static final trong java ..? xin giải thíchTại sao mã trong khối tĩnh không thực thi?

package com.test.doubt;` 

class Doubt { 

    public static final int constant = 123; 
    public static int stat = 123; 

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

public class MyProgram { 

    public static void main(String[] args) { 
    System.out.println(Doubt.constant); 
    } 
} 

Trả lời

10

Các static final int sẽ được biên dịch trực tiếp vào mã của bạn dưới dạng giá trị của nó. Đó là để nói, JVM nhìn thấy và đang thực hiện:

System.out.println(123); 

và bạn không chạm vào aptly tên Doubt lớp học của bạn ở tất cả (đây là một cuộc tranh cãi cho không xác định hằng số theo cách này, btw. Nếu bạn thay đổi giá trị đó, bạn phải biên dịch lại mỗi tham chiếu lớp học)

+0

Cảm ơn .. :) Bây giờ tôi đã rõ ràng .. – jenuine

20

Mã của bạn không khởi tạo lớp Doubt, chính vì Doubt.constant một hằng số. Giá trị của nó được nướng thành MyProgram lúc biên dịch - thậm chí bạn có thể xóa Doubt.class sau khi biên dịch và chương trình của bạn vẫn chạy.

Run

javap -c com.test.doubt.MyProgram 

để có một cái nhìn chính xác những gì mã của bạn trông giống như sau khi biên dịch.

Xem section 15.28 of the JLS cho những gì cấu thành biểu thức liên tục. Ví dụ, đây vẫn sẽ là một hằng số:

public static final String FOO = "Foo"; 

và như vậy sẽ tất cả trong số này:

public static final String FOO = "Foo"; 
public static final String BAR = "Bar"; 
public static final String FOOBAR = FOO + BAR; 

... nhưng điều này sẽ không được

public static final String NOT_A_CONSTANT = "Foo".substring(0, 1); 
+0

+1 Nói cách khác, trình biên dịch 'javac' tối ưu hóa sự cần thiết của lớp' Doubt'. –

+3

@Thilo: Không, nó * không * cũng xảy ra đối với Chuỗi, miễn là nó là hằng số biên dịch. Xem phần 15.28 của JLS để biết chi tiết. –

+0

'gói com.test.doubt; lớp Doubt { \t hằng số tĩnh cuối cùng công khai = 123; \t static tĩnh int = 123; \t tĩnh { \t \t System.out.println ("Khối tĩnh"); \t}} public class MyProgram { \t public static void main (String [] args) {// \t \t System.out.println (Doubt.constant); \t \t System.out.println (Doubt.stat); \t \t \t \t \t}} 'nhưng mã này in khối tĩnh, vì thế tôi bị lẫn lộn – jenuine

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