4

私は配列の静的フィールドで以下にリストされている次のクラスを持っています。コンストラクターを作成してすべての配列を初期化し、それを public static void BookInfo メソッドに渡す方法を教えてください/説明してください。どんな助けでも大歓迎です!

  public class BookInfo {

    // Global arrays accessible by all methods
public static String[] isbnInfo = {

        "978-0060014018",
        "978-0449221431",
        "978-0545132060",
        "978-0312474881",
        "978-0547745527"

      };


public static String[] bookTitleInfo = {

            "The Greatest Stories",
            "The Novel",
            "Smile",
            "The Bedford Introduction to Drama",
            "AWOL on the Appalachian Trail"

           };

public static String[] authorInfo = {

         "Rick Beyer",
         "James A. Michener",
         "Raina Telgemeier",
         "Lee A. Jacobus",
         "David Miller"

        };

public static String[] publisherInfo = {

            "HerperResource",
            "Fawcett",
            "Graphix",
            "Bedford St. Martins",
            "Mariner Books"

            };

public static String[] dateAddedInfo = {

            "05/18/2003", 
            "07/07/1992", 
            "02/01/2010", 
            "09/05/2008", 
            "11/01/2011"

            };

public static int[] qtyOnHandInfo = {7, 5, 10, 2, 8};

public static double[] wholesaleInfo = {12.91, 7.99, 6.09, 54.99, 10.17};

public static double[] retailInfo = {18.99, 3.84, 4.90, 88.30, 14.95};

public static void BookInfo() {

    System.out.println("             Serendipity Booksellers");
    System.out.println("                Book Information\n");       


    for(int i = 0; i < isbnInfo.length; i++){

        System.out.println("ISBN: " + isbnInfo[i]);
        System.out.println("Title: " + bookTitleInfo[i]);
        System.out.println("Author: " + authorInfo[i]);
        System.out.println("Publisher: " + publisherInfo[i]);
        System.out.println("Date Added: " + dateAddedInfo[i]);
        System.out.println("Quantity-On-Hand: " + qtyOnHandInfo[i]);
        System.out.println("Wholesale Cost: $ " + wholesaleInfo[i]);
        System.out.println("Retail Price: $ " + retailInfo[i]);
        System.out.println();

         }
            }
    }
4

3 に答える 3

7

あなたがしたいことは、staticブロックを使用することです。staticデータは、他のコードが実行される前に初期化されます。constructorオブジェクトがインスタンス化されたときにのみ呼び出され、そのタイプのオブジェクトがインスタンス化されるたびstaticに呼び出され、アプリケーションの実行時に一度初期化されます。

public static final String[] ISBN_INFO; 

static 
{ 

    BookInfo.ISBN_INFO = {
    "978-0060014018",
    "978-0449221431",
    "978-0545132060",
    "978-0312474881",
    "978-0547745527" }; 

  // do the same thing with the other blocks

}

static変数finalも同様に作成することをお勧めします。

于 2012-10-18T14:30:24.510 に答える
3

宣言または静的ブロックで配列を初期化することができます。これにはコンストラクターを使用する必要はありません。例えば:

private static String[] array = {"a", "b", "c"};

またはこのように:

private static String[] array;
static {
    array = new String[] {"a", "b", "c"};
}

実際、コンストラクターで初期化するとエラーになる可能性があります。コンストラクターを呼び出して新しいインスタンスが作成されるたびに、静的メンバーを変更しないでください。

于 2012-10-18T14:31:26.493 に答える
2

静的変数は、クラスのロード時にメモリにロードされます。そしてその時彼らだけがinitializedです。コンストラクターで初期化する必要はありません。

ただし、を使用static initializer blockしてそれらを初期化できます。

private static int[] arr;
static {
    // initialize your arrays here in static initializer block.
     arr = new int[5];
     arr[0] = 5; arr[1] = 10; ... so on
}

Static initializerブロックは、クラスのロード時に1回実行されます。クラスの静的変数の初期化を処理します。

さらに、静的変数はクラスのすべてのインスタンス間で共有されます。したがって、1つのインスタンスを介してそれらに加えた変更は、すべてのインスタンスに反映されます。したがって、コンストラクターで初期化することは意味がありません。

于 2012-10-18T14:28:38.317 に答える