簡體   English   中英

我可以初始化方法之外的數組,就像我們初始化成員/字段變量一樣

[英]can i initialize an array outside the method just like we initialize a member/field variable

我想在實例級別初始化數組,但我無法在這里初始化代碼

public class Arrays {

    /** Creates a new instance of Arrays */

        int []arr2=new int[2];
        arr2[0]=20;//error at compile time
        arr2[1]=30;//error 


    public Arrays() {        }
    public static void main(String []args)
    {
        System.out.println("Element at 0th position is "+arr2[0]);
        System.out.println("Element at 1th position is "+arr2[1]);
    }


}

如果你想在宣布它為類成員的同時進行初始化,就這樣做

class MyClass{
    int []arr2={20,30};
}  

以下是一個聲明,你不能在你想要做的地方寫聲明

arr2[0]=20;//error at compile time

這是初始化的方法

int[] arr2 = { 20, 30 };

為了完整,不美觀,以下將起作用:

public class Arrays {

        int []arr2=new int[2];
        // this is a field definition

        { // and this is a dynamic initializer,
          // it runs after the constructor's
          // first line
            arr2[0]=20;
            arr2[1]=30;
        }
}

但是,當然最好的做法是初始化數組,如其他答案所示。


並回答這個問題:

在Class級別,只允許以下內容:

  • 構造函數定義
  • 方法定義
  • 內部類定義(包括接口和枚舉)
  • 字段定義
  • 初始化程序塊(靜態或動態/實例)

不允許使用語句,它們必須嵌套在上述其中一個語句中。


關於Adriaan Koster的評論:

它們被稱為實例初始化塊。 “靜態”的反面是OO中的“實例”,而不是“動態”。

沒錯,實例是更好的OO術語。 但在語言上,動態與靜態相反,所以我會堅持動態。

實例初始化程序塊由編譯器復制到每個構造函數中,並在構造函數代碼之前運行,而不是在之后運行。

實際上,它們被復制到第一行之后的構造函數中(隱式或顯式this()super()調用)。 所以從技術上講,我們要么是對的,要么都是錯的(初始化程序在第一行之后運行,然后在其余部分運行)。

澄清(關於第一行):

  • 每個類至少有一個構造函數。 如果不添加,則編譯器會添加不帶參數的公共構造函數。
  • 每個構造函數都以調用同一個類的另一個構造函數this(args)或超類的構造函數( super(args) )開始。 如果您不編寫其中一行,編譯器將插入不帶參數的super()調用。 所以每個構造函數至少有一個語句。 初始化程序在初始語句之后運行。

參考:

代碼如arr2[0]=20; 不能放在類級別,它必須在方法或代碼塊內。 幸運的是,Java允許int [] arr = {20,10};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM