2013-02-06 33 views
22

Sau khi thực hiện bài viết về chủ đề này, tôi thấy mình ít bối rối. Vì vậy, một lần nữa yêu cầu điều nàymột hàm khởi tạo trả lại trong java

"Nhà xây dựng java có trả về bất kỳ giá trị nào không?"

Sách nói rằng họ không thể trả lại giá trị nhưng giáo sư nói họ có thể và họ luôn làm? Vì điều khiển cần phải được chuyển sang một số có giá trị nào đó hoặc không?

+3

Có lẽ giáo sư của bạn có nghĩa là họ trả lại một ví dụ mới? –

+0

Có thể điều này sẽ giúp: http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5 – kosa

Trả lời

7

Một hàm tạo trả về một thể hiện mới của lớp mà nó thuộc về, ngay cả khi nó không có câu lệnh trả về rõ ràng.

+0

hàm tạo nếu không trả về bất cứ điều gì thì tại sao điều này được sử dụng bên trong mỗi hàm tạo bởi trình biên dịch ngầm để trả lại điều này. –

27

Đây là một chút khó hiểu: các nhà thầu thực sự không trả về một giá trị; nó là toán tử new. Tuy nhiên, các nhà xây dựng luôn được sử dụng với new*, vì vậy có vẻ như họ luôn luôn trả về giá trị.


* Đây là cách đơn giản hóa nhẹ: bạn có thể sử dụng hàm tạo không có new nếu bạn xem qua phản ánh. Tuy nhiên, các cơ chế tương tự sẽ được chơi.

+1

mới chỉ là một từ khóa để làm thế nào nó có thể trả về một giá trị? –

+10

@shivdhwajpndey Tôi không nói rằng từ khóa 'new' trả về một giá trị: Tôi đã nói toán tử' new' * *. Từ khoá và các ký tự đặc biệt là các phần tử cú pháp; họ không làm gì cả. Đó là các nhà khai thác mà họ đại diện cho điều đó. Từ khóa 'new' tự nó không có nghĩa là' + 'hay' -' còn lại. Họ cần toán hạng. Giống như một phép trừ đơn nhất nhận một toán hạng phải là một số, toán tử 'new' nhận một toán hạng phải là một hàm tạo. Toán tử 'new' sẽ quan tâm đến việc cấp phát bộ nhớ, gọi hàm tạo, chuyển nó qua các tham số bắt buộc và trả về giá trị cho bạn. – dasblinkenlight

+1

Câu trả lời tuyệt vời –

6

Tôi nghĩ rằng sự nhầm lẫn hoàn toàn là không hợp lý. Khi bạn khai báo hàm tạo, bạn thực hiện như sau:

public class Foo { 
    public Foo() {} 
} 

Ở đây, không có giá trị trả về rõ ràng.

Tuy nhiên, khi bạn tạo một đối tượng, cú pháp như sau:

Foo foo = new Foo(); 

Điều này tạo ra một đối tượng mới bằng cách phân bổ bộ nhớ và gọi các nhà xây dựng. Ở đây, kết quả rõ ràng là một ví dụ của Foo.

Một cách để đối chiếu ký hiệu rõ ràng xung đột là bằng cách suy nghĩ về một hàm tạo như trả về đối tượng đang được xây dựng, nhưng làm như vậy ngầm.

+0

Nhưng trình biên dịch nói khác khi kiểm tra nó nói đây là trở về từ constructor –

+0

@shivdhwajpandey 'this' là đối tượng đang được xây dựng. – 2rs2ts

1

Tôi đồng ý với trên hai lời giải thích, và muốn thêm một số báo cáo để làm cho rõ ràng hơn:

Câu hỏi: Đáp:: một phương pháp có tên của nó tương tự như lớp một constructor là gì.

Câu hỏi: Nhà xây dựng có trả về bất kỳ điều gì không? Trả lời: Không, thậm chí không VOID.

Câu hỏi: Cách gọi hàm tạo? OR làm thế nào để một constructor được gọi? Câu trả lời: Bằng cách tạo đối tượng bằng từ khóa MỚI.

Câu hỏi: cách tạo đối tượng? Trả lời: Một cách để tạo đối tượng là sử dụng toán tử MỚI, trả về một đối tượng của đối tượng.

+0

constructor nếu doesnt return bất cứ điều gì thì tại sao điều này được sử dụng bên trong mỗi constructor bởi trình biên dịch ngầm để trả về điều này. –

-2

hàm tạo ngầm hoàn trả kiểu lớp ........

0

Theo định nghĩa, không có khả năng trả lại giá trị từ hàm tạo.Nhà xây dựng không hỗ trợ bất kỳ loại trả lại nào là

3

Các nhà xây dựng là các phương pháp đặc biệt. Vâng sự khác biệt cơ bản trong nhà xây dựng và phương pháp là

Constructor

  • có cùng tên như của Lớp
  • không có kiểu trả về
  • Có thể quá tải nhưng không ghi đè.

trong khi

Phương pháp

  • tháng hoặc có thể không có cùng tên như của Class.
  • có loại trả lại
  • Có thể bị quá tải và ghi đè.

Cú pháp Ví ​​Phương pháp:
AccessModifier ReturnType Class (...)
EG: public static void main (String [] args)

Cú pháp Ví ​​Constructors:
AccessModifier No ReturnType Class (...)
EG: public static main (String [] args)

Xin lưu ý:

Java là một ngôn ngữ mạnh mẽ gõ, vì vậy mỗi hàm có kiểu trả về của nó, và nhà xây dựng luôn luôn trả về một thể hiện của lớp.

0

Hãy tưởng tượng mình trong tình huống mà bạn được yêu cầu vẽ một con đại bàng.

Kịch bản đầu tiên: Bạn không được cho biết nó trông như thế nào. Tất cả các bạn biết là để tạo ra một phác thảo đơn giản của một Kịch bản thứ hai Eagle

: Bạn đang được nói chính xác những gì màu sắc để sử dụng và tư thế trong đó Eagle là để được phác thảo

Bây giờ kịch bản đầu tiên mô tả chính xác những gì một constructor mặc định làm và kịch bản thứ hai là khi bạn có thông tin như thế nào đối tượng nên được tạo ra. Nhưng cho đến khi và trừ khi bạn lấy bút chì và giấy và bắt đầu phác họa bạn sẽ không được trả lại bất cứ thứ gì.

Vì vậy, khi bạn gọi hàm tạo bằng cách sử dụng từ khóa mới, bạn sẽ nhận được một đối tượng. Mặc dù nó không trả lại một cách rõ ràng một cái gì đó nhưng thay vào đó nó tạo ra hoặc xây dựng một cái gì đó mà bạn có thể sử dụng như một thể hiện của một lớp.

0

có, đó là phiên bản lớp hiện tại. (Chúng tôi không thể sử dụng kiểu trả về nhưng nó trả về một giá trị).

0

Constructor trả về cấu trúc chi tiết của lớp ở cấp độ rất thấp (giống như dung lượng bộ nhớ được sử dụng bởi dữ liệu và phương thức) + thực thi mã được viết trong hàm tạo. Trong khi toán tử mới thực hiện, trả về hàm khởi tạo, làm toán hạng của nó và cấp phát bộ nhớ tại thời gian chạy và trả về trình xử lý của nó cho biến lớp.

1

vì vậy, đến nay tôi quan tâm đến hàm tạo trả về id tham chiếu đến biến tham chiếu của lớp đó. lấy một ví dụ:

class demo 
{ 
demo{} 
} 
class demo1 
{ 
public static void main(String as[]) 
{ 
demo d = new demo(); 
System.out.println(d); 
} 
} 

đầu ra: demo @ 7d4991ad nó là id tài liệu tham khảo của đối tượng 'd' của bản demo lớp mà được trả về bởi các nhà xây dựng. nếu u sẽ không định nghĩa constructor của bạn thì jvm sẽ lấy id này từ constructor mặc định.

bạn có thể kiểm tra chéo nó theo dòng này: System.out.println (bản trình diễn mới()); đầu ra: demo @ 1b6d3586. vì mọi đối tượng đều có vùng heap riêng biệt trong bộ nhớ nên id tham chiếu của từng đối tượng cũng khác nhau.

+1

Rất khó để thụt lề mã một chút để làm cho nó dễ đọc? –

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