2014-12-30 15 views
5

tôi đang học Java và viết mã đơn giản dưới đây:Gán một biến tĩnh trước khi tuyên bố

public class Test { 

    private int a = b; 
    private final static int b = 10; 

    public int getA() { 
     return a; 
    } 
} 

public class Hello { 

    public static void main(String[] args) { 
     Test test = new Test(); 
     System.out.println(test.getA()); 
    } 

} 

Kết quả: 10. Làm tốt! Nó chạy thành công và không có lỗi.

Có ai vui lòng giải thích tại sao tôi có thể gán biến tĩnh trước khi khai báo không?

+0

bản sao có thể có của [Thứ tự các biến lớp Java được khởi tạo là gì?] (Http://stackoverflow.com/questions/2138801/in-what-order-are-java-class-variables-initialised) – Joe

+0

thành viên tĩnh là đã được khởi tạo khi lớp đã được nạp trước khi tạo bất kỳ cá thể nào của nó. – Braj

+0

Bạn có ý gì với "chỉ định trước khi khai báo"? "int b" tuyên bố, "= 10" chỉ định, vì vậy bạn khai báo trước khi bạn chỉ định. Hoặc bạn có nghĩa là sử dụng trước khi khai báo? –

Trả lời

5

Việc chuyển nhượng

private int a = b; 

diễn ra khi bạn tạo một đối tượng mới của Test (ngay trước khi các nhà xây dựng được gọi).

Khai báo và khởi tạo biến tĩnh b, diễn ra trước khi cá thể được tạo, khi lớp được tải.

Thứ tự của các câu lệnh không quan trọng, vì các biến tĩnh luôn được khởi tạo trước tiên.

+0

"(ngay trước khi hàm tạo được gọi)" không hoàn toàn, việc khởi tạo các trường được chuyển đến các hàm tạo, vì vậy nó giống như "khi hàm tạo được gọi, nhưng sau lệnh gọi" siêu (đối số) "ngầm định hoặc rõ ràng của nó. – Pshemo

+0

Bạn có thể chia sẻ bất kỳ tài liệu chính thức nào cho tôi không? Tôi thực sự muốn hiểu sâu sắc –

+1

@DatNguyen Tài liệu chính thức nhất là JLS. Đọc các phần [12.4] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4) và [12.5] (http://docs.oracle.com /javase/specs/jls/se8/html/jls-12.html#jls-12.5). – Eran

0

Thứ tự khai báo biến không thực sự quan trọng trong mã của bạn như trong thực tế biến tĩnh sẽ được khởi tạo trước các biến không tĩnh.

0

Biến tĩnh được liên kết với một lớp - tất nhiên luôn tồn tại trước các phiên bản của lớp. Vì vậy, bạn có thể tự do gán nó cho các trường instance.

1

Javavariables được khởi tạo theo thứ tự:

  1. biến tĩnh của superclasses nếu có
  2. biến tĩnh của lớp hiện hành.
  3. biến tĩnh, và khối tĩnh theo thứ tự mà chúng tuyên bố
  4. biến Instance của superclasses
  5. Tất cả các biến thể hiện của lớp hiện hành.
  6. biến Instance, và khối khởi tạo mức dụ, để khai

Do đó "b" là intialized trước khi "a".

Hy vọng điều này sẽ hữu ích.

0

Mã bạn viết hoạt động tốt vì private final static int b = 10; là một lớp biến (tĩnh lĩnh vực). Những kiểu biến này được khởi tạo lần đầu tiên.

Sau đó được thực hiện dòng private int a = b; mà khởi sự dụ biến (lĩnh vực) a.

Tóm lại, không quan trọng thứ tự các biến được khai báo trong mã của bạn.Biến lớp luôn được khai báo trước biến thể hiện.

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