簡體   English   中英

在 Java 中將 ArrayList 聲明為靜態時的奇怪問題

[英]Weird issue when declaring ArrayList as static in Java

public static void main(String[] args) {

    NewClass Camry = new NewClass("Toyota", "Camry", "gray", "120,000");
    NewClass Sonata = new NewClass("Hyundai", "Sonata", "red", "100,000");
    NewClass Accent = new NewClass("Hyundai", "Accent", "blue", "60,000");

    System.out.println(NewClass.PrintAll);   

}

...

public class NewClass {

    static ArrayList<String> cars = new ArrayList<>();
    static ArrayList<String> carsInfo = new ArrayList<>();

    static String PrintAll = "";

    String make = "";
    String model = "";
    String color = "";
    String price = "";

    public NewClass(String make, String model, String color, String price) {

        this.make = make;
        this.model = model;
        this.color = color;
        this.price = price;

        carsInfo.add("Make: " + this.make + " \t ");
        carsInfo.add("Model: " + this.model + " \t ");
        carsInfo.add("Color: " + this.color + " \t ");
        carsInfo.add("price:  " + this.price + " SAR\n");

        cars.add((carsInfo.get(0) + carsInfo.get(1) + carsInfo.get(2) + carsInfo.get(3)));

        PrintAll += cars.get(0);
    }

}

只是為了讓您理解我的問題,這是我將兩個 ArrayLists 聲明為static時的輸出:

品牌:豐田 車型:凱美瑞 顏色:灰色 價格:120,000 沙特里亞爾
品牌:豐田 車型:凱美瑞 顏色:灰色 價格:120,000 沙特里亞爾
品牌:豐田 車型:凱美瑞 顏色:灰色 價格:120,000 沙特里亞爾

什么時候應該:

品牌:豐田 車型:凱美瑞 顏色:灰色 價格:120,000 沙特里亞爾
品牌:現代 型號:索納塔 顏色:紅色 價格:100,000 沙特里亞爾
品牌:現代 型號:口音 顏色:藍色 價格:60,000 沙特里亞爾

出於某種原因,第一個對象值與其他所有對象重復。
不使用靜態一切都很好,但我需要數組是靜態的,這樣我就可以從另一個類訪問它們。 所以我真的很想知道是什么原因造成的。

靜態字段通常也稱為“類的變量”。 即使類沒有被實例化,它們的值也總是可以被初始化。 這就是為什么當您創建此類的新實例時,您總是會在 ArrayLists 中填充那些第一個值 - 構造函數不斷推送到這些靜態變量,並且由於它們不屬於對象的任何實例,這些值只是不斷添加,這也是它在沒有 static 關鍵字的情況下工作的原因。

一般來說,靜態的使用大多不是一個好主意。 現在,我只能認為它對常量有用 - 如果我遺漏了什么,請評論下來。 我建議將這些 ArrayList 字段設為私有且非靜態(除了 PrintAll 字段)。 然后,您可以為那些非靜態字段創建公共訪問器,這樣其他類可以實例化 NewClass(),調用其上的訪問器,它們可以返回該字段的值。

暫無
暫無

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

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