2013-05-06 21 views
11

Tôi tiếp tục nhận được lỗi nói rằng "lệnh gọi tới siêu phải là câu lệnh đầu tiên trong hàm tạo".Gọi đến siêu phải là câu lệnh đầu tiên trong hàm tạo, nhưng nó là

Vấn đề là nó câu lệnh đầu tiên trong hàm tạo của tôi.

public void CheckingAccountCustomer(int a){ 
    super(n, p, b); 
    accountNo = a; 
} 

Và đây là lớp cha của tôi cho điều này.

public void customer(String n, int p, double b){ 
    name = n; 
    pin = p; 
    balance = b; 
} 

Tôi đang làm gì sai ở đây?

+2

Điều thú vị ở đây là, vì đây không phải là các hàm tạo, nên lệnh gọi 'super()' đang cố gắng gọi hàm khởi tạo của lớp cha từ bên trong một phương thức trong lớp con. Thông báo lỗi cho biết "Không phải là dòng đầu tiên trong hàm tạo của con." Điều đó đúng nhưng không hữu ích lắm. Có thể một thông điệp như "Gọi đến siêu không phải trong nhà xây dựng" sẽ là tốt đẹp. –

+0

Tôi chắc chắn không mong đợi để có câu trả lời nhanh chóng này. Tất nhiên, đó là một sửa chữa đơn giản mà tôi đã quá mù để xem. Nhưng vẫn cảm ơn tất cả. –

Trả lời

30

Mã này

public void customer(String n, int p, double b){ 

không phải là một nhà xây dựng. Các nhà xây dựng không có loại trả về, ví dụ: void. Giả sử tên lớp của bạn là customer:

public customer(String n, int p, double b){ 

này áp dụng cho CheckingAccountCustomer quá.

+1

Điều đó đã sửa nó. Cảm ơn bạn. –

+0

Lưu ý rằng mặc dù 'khách hàng' (với một chữ C nhỏ) là một tên lớp hợp lệ, nó được cau mày.Theo quy ước, tên lớp phải bắt đầu bằng một chữ cái viết hoa ('Khách hàng') trong khi tên phương thức bắt đầu bằng một chữ cái nhỏ. – ADTC

8
public void CheckingAccountCustomer(int a){ 

Đó không phải là hàm tạo vì nó có kiểu trả về là void. Nó chỉ là một phương thức cùng tên với lớp. Loại bỏ kiểu trả về.

public CheckingAccountCustomer(int a){ 
+6

Tôi sẽ bỏ phiếu cho mọi câu trả lời bạn đã từng đưa ra, nếu bạn chỉ cần thay đổi từ ngữ thành "Bạn gọi đó là một nhà xây dựng? NÀY là một nhà xây dựng!" – christopher

+0

Ahhh ... Wow tôi cảm thấy bị mù ngay bây giờ. –

+1

@ ChrisCooney: Tôi ước tôi thông minh như bạn! :) –

3
public void CheckingAccountCustomer(int a) 

Đây là phương pháp không phải là hàm tạo vì nó có kiểu trả về.

2

Các constructor được sử dụng để tạo ra một thể hiện của Class, vì vậy nó làm cho không có ý nghĩa nếu nó sẽ cho phép người dùng thay đổi các kiểu trả về (nó có thể nguy hiểm quá). Đó là lý do tại sao các nhà thầu có các loại trả về không.

Khi người khác đã trả lời, hãy xóa loại trả về và nó sẽ trở thành một hàm tạo.

2

Các nhà xây dựng không bao giờ trả lại thứ gì đó (hoặc là void hoặc Object type).

public void CheckingAccountCustomer(int a){ 
    super(n, p, b); 
    accountNo = a; 
} 

do đó không phải là hàm tạo.