2014-04-24 19 views
14

Đầu ra của mã này là 7 20.Hàm khởi tạo hoạt động như thế nào khi khởi tạo một đối tượng?

Tại sao 7 in đầu tiên và 20 được in sau đó?

public class Television 
{ 
    private int channel = setChannel(7); 
    public Television(int channel) 
    { 
     this.channel = channel; 
     System.out.print(channel +""); 
    } 

    public int setChannel(int channel) 
    { 
     this.channel = channel; 
     System.out.print(channel + ""); 
     return channel; 
    } 

    public static void main(String args[]) 
    { 
     new Television(20); 
    } 
} 
+1

1º trường riêng được khởi tạo & 2º hàm tạo được gọi là – Andynedine

+0

Bạn có nghĩ đầu ra phải khác nhau không? Không đầu ra về cơ bản chứng minh những gì sẽ xảy ra? – Radiodef

+0

Các câu hỏi như thế này được yêu cầu ở đây mọi lúc. Tôi không thể tìm thấy chúng ngay bây giờ mặc dù – Cruncher

Trả lời

5

Đầu tiên, trường riêng được khởi tạo và sau đó hàm tạo được gọi.

Vì vậy, đầu ra là 7 20.

Trong java, quá trình sau đây xảy ra khi tạo một đối tượng mới:

  • Tất cả các lĩnh vực tư nhân của đối tượng được định giá.
  • Sau đó, chỉ khi đó, hàm tạo được gọi.
+0

vì vậy nó có nghĩa là các biến intialise đầu tiên của hàm tạo được định nghĩa trong một lớp – varun

+0

@ user2534106 Không, * Java * thực hiện điều này, * sau đó * hàm tạo được gọi. Nó không phải là nhà xây dựng mà làm điều này. –

15

Khi đối tượng được tạo, trường của nó được tạo. Bạn có một thành viên lớp:

private int channel = setChannel(7); 

Khi bạn làm:

new Television(20); 

Trường được khởi tạo và setChannel được gọi trước khi gọi các nhà xây dựng và 7 được in từ đó.

Tất cả các trường của đối tượng được tạo và được điền bằng giá trị được cung cấp (hoặc giá trị mặc định nếu không có giá trị nào được chỉ định). Bạn có thể nghĩ về điều đó như là sự chuẩn bị của cá thể. Sau khi các thành viên này đã sẵn sàng và khởi tạo, hàm tạo được gọi.

Xem JLS để biết thêm thông tin chi tiết.

3

Vì setChannel trong khởi tạo kênh biến được gọi đầu tiên để khởi tạo lớp và phương thức trong hàm tạo sau đó.

3

Khi bạn tạo một đối tượng của một đối tượng, trước tiên bạn tạo các thành viên dữ liệu của nó (tức là dòng đầu tiên được thực thi private int channel = setChannel(7);) và chỉ khi đó Constructor public Television(int channel) {...} tạo đối tượng.

4

Bạn khởi tạo trường 'kênh' của bạn bên ngoài lớp construsctor, do đó khởi tạo này được gọi trước nó.

Đây là những gì gắn thêm khi bạn gọi new Television(20):

1/this.channel set to 7 (init step) 
2/Calling constructor 
3/this.chennel set to 20 (constructor code) 
+0

là Maroun Maroun câu trả lời là không đủ, thay vì bỏ phiếu cho lý do tại sao bạn người trả lời agian –

+7

@ bhutto Bởi vì chúng tôi đã chắc chắn viết câu trả lời của chúng tôi cùng một lúc. Vì vậy, xin vui lòng ngừng gửi ý kiến ​​vô dụng – Gwenc37

14

Bởi vì đó là order of initialization trong Java. Nói tóm lại:

  1. thành viên tĩnh và khối
  2. thành viên Instance và khối
  3. contructor cơ thể
+4

@ bhutto Câu trả lời ngắn là tốt quá. Nhìn vào thời gian, có thể liên kết đến JLS không phải là câu trả lời của Maroun² khi endriu_l bắt đầu câu trả lời của mình. –

+2

@ArlaudPierre cảm ơn vì đã đứng lên cho tôi. Quả thực câu trả lời đầu tiên là thiếu liên kết JLS và - theo ý kiến ​​của tôi - chỉ định các bước khởi tạo trong danh sách được đánh số là dễ đọc hơn –

+1

@bhutto Nếu bạn nhìn vào thời điểm câu trả lời, bạn nhận thấy đôi khi mọi người bắt đầu trả lời câu hỏi cùng một lúc. – hkazemi

6

Câu trả lời là có sẵn trong Java Language Specification:

Ngay trước khi một tài liệu tham khảo đối tượng mới được tạo sẽ được trả về kết quả, hàm tạo được chỉ định được xử lý khởi tạo đối tượng mới bằng cách sử dụng quy trình sau:

  1. Chỉ định đối số cho hàm tạo cho biến tham số mới tạo cho lời gọi hàm tạo này.

  2. Nếu constructor này bắt đầu bằng một lời gọi rõ ràng constructor (§8.8.7.1) của nhà xây dựng khác trong cùng một lớp (sử dụng này) ...

  3. ... Nếu constructor này là dành cho một lớp học khác hơn Object, sau đó constructor này sẽ bắt đầu với một lời gọi rõ ràng hoặc ngầm của một constructor lớp cha (sử dụng siêu) ...

  4. Execute initializers dụ và ví dụ initializers biến cho lớp này, gán các giá trị của biến dụ initializers cho các biến cá thể tương ứng, trong trái sang phải thứ tự xuất hiện văn bản trong mã nguồn của lớp. Nếu việc thực hiện bất kỳ trình khởi tạo nào trong số các trình khởi tạo này dẫn đến một ngoại lệ, thì không có trình khởi tạo thêm nào được xử lý và thủ tục này hoàn thành đột ngột với cùng một ngoại lệ đó. Nếu không, hãy tiếp tục với bước 5.

  5. Thực thi phần còn lại của phần tử này. Nếu việc thực thi đó hoàn thành đột ngột, thì thủ tục này hoàn thành đột ngột vì cùng một lý do. Nếu không, thủ tục này sẽ hoàn thành bình thường.

Nói tóm lại, nếu một constructor không gọi một constructor (sử dụng this) và nó không gọi cho bất kỳ nhà xây dựng lớp cha (sử dụng super) sau đó các biến được khởi tạo trước khi thực hiện mã của constructor.

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