Java Khởi tạo một mảng int trong một phương thức khởi tạo


90

Tôi có một lớp học và trong lớp học đó, tôi có cái này:

 //some code
 private int[] data = new int[3];
 //some code

Sau đó, trong hàm tạo của tôi:

public Date(){
    data[0] = 0;
    data[1] = 0;
    data[2] = 0;
}

Nếu tôi làm điều này, mọi thứ đều ổn. Giá trị dữ liệu mặc định được khởi tạo nhưng nếu thay vào đó tôi thực hiện điều này:

public Date(){
    int[] data = {0,0,0};
}

Nó nói rằng:

Local variable hides a field

Tại sao?

Cách tốt nhất để khởi tạo một mảng bên trong hàm tạo là gì?


Tôi hy vọng bạn đã biết về khái niệm phạm vi của biến? biến của bạn datasau khi "//some code"có một phạm vi của toàn bộ lớp. trong khi biến datatrong hàm tạo đang có một phạm vi bên trong hàm tạo. và một khi phương thức khởi tạo được thực hiện, biến sẽ bị hủy. Và databiến bên trong hàm tạo cũng ẩn biến có cùng tên trong lớp. Đây biện minh cho lỗiLocal variable hides a field
Naveen Babu

Câu trả lời:


178
private int[] data = new int[3];

Điều này đã khởi tạo các phần tử mảng của bạn thành 0. Bạn không cần phải lặp lại điều đó một lần nữa trong hàm tạo.

Trong hàm tạo của bạn, nó phải là:

data = new int[]{0, 0, 0};

Đúng. Đây là cách duy nhất Nó cho phép tôi. Chỉ đưa dữ liệu; nói rằng "nó không phải là một tuyên bố". Cảm ơn
Favolas

Anh ta không thể sử dụng data=new int[3]trong hàm tạo defualt Date()?
parsecer

7

Bạn có thể làm:

public class Data {
    private int[] data;

    public Data() {
        data = new int[]{0, 0, 0};
    }
}

Khởi tạo datatrong hàm tạo , hoặc:

public class Data {
    private int[] data = new int[]{0, 0, 0};

    public Data() {
        // data already initialised
    }
}

Khởi tạo datatrước khi mã trong hàm tạo được thực thi.


Tôi phải đặt data = new int [] {0,0,0}; bên trong hàm tạo. Nếu tôi khởi tạo trước mã trong hàm tạo chỉ đặt dữ liệu; bên trong constructor đã cho tôi lỗi "không phải là một tuyên bố"
Favolas

nếu có hơn triệu phần tử trong mảng .. bạn muốn sử dụng mã đầu tiên và thay đổi dòng public Data() throws Error {nếu OutOfMemoryErrorsẽ được ném.
nick

4

Điều này là do, trong hàm tạo, bạn đã khai báo một biến cục bộ có cùng tên với một thuộc tính.

Để cấp phát một mảng số nguyên mà tất cả các phần tử được khởi tạo bằng 0, hãy viết điều này trong hàm tạo:

data = new int[3];

Để cấp phát một mảng số nguyên có các giá trị ban đầu khác, hãy đặt mã này vào hàm tạo:

int[] temp = {2, 3, 7};
data = temp;

hoặc là:

data = new int[] {2, 3, 7};

4

tại sao không đơn giản

public Date(){
    data = new int[]{0,0,0};
}

lý do bạn gặp lỗi là vì int[] data = ...khai báo một biến mới và ẩn trườngdata

tuy nhiên, cần lưu ý rằng nội dung của mảng đã được khởi tạo bằng 0 (giá trị mặc định của int)


1

trong hàm tạo của bạn, bạn đang tạo một mảng int khác:

 public Date(){
  int[] data = {0,0,0};
  }

Thử cái này:

 data = {0,0,0};

LƯU Ý: Bằng cách này, bạn KHÔNG cần khởi tạo các phần tử mảng của mình nếu nó được khai báo là một biến thể hiện. Các biến phiên bản tự động nhận các giá trị mặc định của chúng, đối với một mảng số nguyên, các giá trị mặc định đều là số 0.

Nếu bạn đã khai báo cục bộ mảng mặc dù chúng, bạn sẽ cần khởi tạo từng phần tử.


0

Cách tốt nhất là không viết bất kỳ câu lệnh khởi tạo nào. Điều này là do nếu bạn viết int a[]=new int[3]thì theo mặc định, trong Java tất cả các giá trị của mảng tức là a[0], a[1]a[2]được khởi tạo thành 0! Về biến cục bộ ẩn một trường, hãy đăng toàn bộ mã của bạn để chúng tôi đưa ra kết luận.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.