2011-08-24 41 views
22

sự khác biệt giữa xác định và initialising các biến thành viên vào đầu của định nghĩa lớp, và xác định các biến thành viên đầu tiên và initialising các biến thành viên trong constructor là gì?Khởi tạo các biến thành viên trong phần đầu của định nghĩa lớp hoặc trong hàm tạo?

Say, ví dụ:

public class Test { 
    private int foo = 123; 
    private boolean flag = false; 

    public void fooMethod() {...} 
} 

Versus:

public class Test { 
    private int foo; 
    private boolean flag; 

    public Test() { 
     foo = 123; 
     flag = false; 
    } 

    public void fooMethod() {...} 
} 

Cảm ơn trước.

+1

bản sao có thể có của [Thực tiễn tốt nhất: Khởi tạo trường lớp trong hàm tạo hoặc khai báo?] (Http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at -declaration) –

Trả lời

17

Trong ví dụ của bạn, sự khác biệt duy nhất là khi chúng được khởi tạo. Theo JLS, các biến mẫu được khởi tạo trước khi hàm tạo được gọi. Điều này có thể trở nên thú vị khi bạn có các lớp siêu để xử lý, vì thứ tự khởi tạo không phải lúc nào cũng rõ ràng. Với điều đó, hãy nhớ rằng các biến "siêu" sẽ vẫn được khởi tạo khi không có hàm tạo siêu rõ ràng nào được gọi.

+0

+1 và tôi tưởng tượng giới thiệu tất cả các loại lỗi vô cùng khó khăn để theo dõi ... –

5

Sự khác biệt là thứ tự mà chúng được khởi tạo/thiết lập.

Biến thành viên lớp học của bạn sẽ được khai báo/đặt trước khi hàm tạo của bạn được gọi. Sở thích cá nhân của tôi là đặt chúng trong hàm tạo.

0

Thông thường, một hàm tạo sẽ chấp nhận các đối số và gán các đối số đó cho các trường của lớp.

public Test(int foo, boolean flag) 
{ 
    this.foo = foo; 
    this.flag = flag; 
} 
+0

không chắc chắn ý của bạn là gì? –

+0

@aib, là Java, không phải C++. – Triang3l

2

Khởi tạo trong lớp cho phép bạn tránh viết một hàm tạo tầm thường.

Bạn phải khởi tạo các thành viên thể hiện phụ thuộc vào các tham số hàm tạo bên trong hàm tạo. Nó có thể là hợp lý, cho dễ đọc nếu không có gì khác, để đặt khởi tạo của tất cả các thành viên khác trong cùng một nhà xây dựng.

Nếu không, không có sự khác biệt.

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