Java เตรียมใช้งานอาร์เรย์ int ในตัวสร้าง


94

ฉันมีชั้นเรียนและในชั้นนั้นฉันมีสิ่งนี้:

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

จากนั้นในตัวสร้างของฉัน:

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

ถ้าฉันทำอย่างนี้ทุกอย่างก็โอเค ค่าข้อมูลเริ่มต้นจะเริ่มต้น แต่ถ้าฉันทำสิ่งนี้แทน:

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

มันบอกว่า:

Local variable hides a field

ทำไม?

วิธีที่ดีที่สุดในการเริ่มต้นอาร์เรย์ภายในตัวสร้างคืออะไร?


ฉันหวังว่าคุณจะตระหนักถึงแนวคิดของขอบเขตของตัวแปร? ตัวแปรของคุณdataหลัง"//some code"มีขอบเขตของคลาสทั้งหมด ในขณะที่ตัวแปรdataในตัวสร้างกำลังมีขอบเขตภายในตัวสร้าง และเมื่อสร้างตัวสร้างเสร็จตัวแปรจะถูกทำลาย และdataตัวแปรภายในตัวสร้างยังซ่อนตัวแปรด้วยชื่อเดียวกันในคลาส นี่เป็นการพิสูจน์ข้อผิดพลาดLocal variable hides a field
Naveen Babu

คำตอบ:


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

สิ่งนี้เริ่มต้นองค์ประกอบอาร์เรย์ของคุณเป็น 0 แล้วคุณไม่จำเป็นต้องทำซ้ำอีกครั้งในตัวสร้าง

ในตัวสร้างของคุณควรเป็น:

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

ใช่. นี่เป็นวิธีเดียวที่อนุญาตให้ฉัน การใส่ข้อมูลเท่านั้น กล่าวว่า "มันไม่ใช่คำสั่ง" ขอบคุณ
Favolas

เขาไม่สามารถใช้data=new int[3]ในตัวสร้าง defualt ได้Date()หรือไม่?
พาร์เซกเกอร์

7

คุณสามารถทำได้:

public class Data {
    private int[] data;

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

ซึ่งเริ่มต้นdataในตัวสร้างหรือ:

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

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

ซึ่งเริ่มต้นdataก่อนที่โค้ดในตัวสร้างจะถูกเรียกใช้งาน


ฉันต้องใส่ data = new int [] {0,0,0}; ภายในตัวสร้าง ถ้าฉันเริ่มต้นก่อนโค้ดในตัวสร้างที่ใส่ข้อมูลเท่านั้น ภายในตัวสร้างทำให้ฉันมีข้อผิดพลาด "not a statement"
Favolas

หากมีมากกว่าล้านองค์ประกอบในอาร์เรย์ .. คุณต้องการใช้รหัสแรกและเปลี่ยนบรรทัดpublic Data() throws Error {หากOutOfMemoryErrorจะถูกโยน
ชื่อเล่น

4

เนื่องจากในตัวสร้างคุณได้ประกาศตัวแปรโลคัลที่มีชื่อเดียวกับแอตทริบิวต์

ในการจัดสรรอาร์เรย์จำนวนเต็มซึ่งองค์ประกอบทั้งหมดเริ่มต้นเป็นศูนย์ให้เขียนสิ่งนี้ในตัวสร้าง:

data = new int[3];

ในการจัดสรรอาร์เรย์จำนวนเต็มซึ่งมีค่าเริ่มต้นอื่น ๆ ให้ใส่รหัสนี้ในตัวสร้าง:

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

หรือ:

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

4

ทำไมไม่เพียง

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

สาเหตุที่คุณได้รับข้อผิดพลาดเป็นเพราะint[] data = ...ประกาศตัวแปรใหม่และซ่อนฟิลด์data

อย่างไรก็ตามควรสังเกตว่าเนื้อหาของอาร์เรย์เริ่มต้นเป็น 0 แล้ว (ค่าเริ่มต้นของint)


1

ในตัวสร้างของคุณคุณกำลังสร้างอาร์เรย์ int อื่น:

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

ลองสิ่งนี้:

 data = {0,0,0};

หมายเหตุ: โดยวิธีนี้คุณไม่จำเป็นต้องเริ่มต้นองค์ประกอบอาร์เรย์ของคุณหากถูกประกาศเป็นตัวแปรอินสแตนซ์ ตัวแปรอินสแตนซ์จะได้รับค่าเริ่มต้นโดยอัตโนมัติซึ่งสำหรับอาร์เรย์จำนวนเต็มค่าดีฟอลต์คือศูนย์ทั้งหมด

หากคุณมีการประกาศอาร์เรย์ในเครื่องแม้ว่าคุณจะต้องเริ่มต้นแต่ละองค์ประกอบ


0

วิธีที่ดีที่สุดคืออย่าเขียนคำสั่งเตรียมข้อมูลเบื้องต้นใด ๆ นี้เป็นเพราะถ้าคุณเขียน int a[]=new int[3]แล้วโดยค่าเริ่มต้นในชวาทุกค่าของอาร์เรย์เช่นa[0], a[1]และa[2]จะเริ่มต้นที่จะ0! เกี่ยวกับตัวแปรท้องถิ่นที่ซ่อนฟิลด์ให้โพสต์รหัสทั้งหมดของคุณเพื่อให้เราสรุปได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.