2012-04-22 32 views
9

Có bắt buộc phải gọi hàm tạo lớp cơ sở trong Java không? Trong C++ nó là tùy chọn, vì vậy tôi hỏi điều này.Nhà xây dựng ngầm là gì trên Java

Khi tôi mở rộng ArrayAdapter, tôi nhận được lỗi này: "Implicit super constructor ArrayAdapter<String>() is undefined. Must explicitly invoke another constructor"

Vì vậy, mục đích của cuộc gọi constructor cơ sở là gì? Khi tôi tạo ra constructor lớp cơ sở đối tượng sẽ gọi & sau đó nó xuất phát từ quyền xuất phát.

+0

Bạn không thể có một constructor rrayAdapter (). Nếu bạn thêm một hàm tạo mặc định trong lớp cơ sở, nó sẽ ổn. –

+0

Liên quan: [Lỗi Java: Hàm khởi tạo siêu ngầm không xác định đối với hàm dựng mặc định] (http://stackoverflow.com/questions/1197634/java-error-implicit-super-constructor-is-undefined-for-default-constructor). – Lion

+0

Vì vậy, có một số thứ như DerivedClass (int x, int y): BaseClass (y), trong C++ ???. đúng?? Ngoài ra một nghi ngờ nữa, trong cơ chế trên, lớp khởi tạo lớp cơ sở hai lần hoặc một lần? – Naruto

Trả lời

10

Hàm tạo không có args được gọi ngầm nếu bạn không gọi cho chính mình, không hợp lệ nếu hàm tạo đó không tồn tại. Lý do nó được yêu cầu để gọi một hàm tạo siêu là lớp cha thường có một số trạng thái mà nó mong đợi ở sau khi được xây dựng, có thể bao gồm các biến riêng tư không thể được đặt trong một lớp con. Nếu bạn không gọi hàm khởi tạo, nó sẽ để đối tượng ở trạng thái có thể không hợp lệ, có thể gây ra tất cả các loại vấn đề.

+0

Vì vậy, có một số thứ như DerivedClass (int x, int y): BaseClass (y), trong C++ ???. đúng?? Ngoài ra một nghi ngờ nữa, trong cơ chế trên, lớp cơ sở lớp khởi tạo hai lần hoặc một lần? – Naruto

+0

Vâng, đúng vậy. Java chỉ cho phép bạn gọi một hàm tạo trong một hàm tạo, hoặc là một lớp cơ sở hoặc chuyển tiếp tới một hàm tạo khác trong lớp hiện tại, do đó hàm tạo lớp cơ sở chỉ có thể được gọi một lần. – ricochet1k

0

Không cần thiết phải gọi hàm khởi tạo no-args của lớp siêu. Nếu bạn muốn gọi một constructor với args, người dùng siêu từ khóa như chương trình dưới đây:

super(arg1, ...); 
+0

"Nó không cần thiết để gọi các nhà xây dựng no-args của lớp siêu", nhưng sẽ Java chèn một cuộc gọi nào? –

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