簡體   English   中英

在Java中調用new時,是否會創建構造函數或類的副本?

[英]When you call new in Java, does it create a copy of the constructor, or the class?

我目前正在從事Java任務,由於某種原因,它可以工作 - 但在我看來,它不應該! 我所擁有的是一個主要方法,通過調用創建三個新按鈕

panel.add(new ButtonApp());

ButtonApp是我的ButtonApp類中定義的構造函數。

在我的課程開始時,我有一個聲明如下的變量:

public int clicks = 0;

此變量的目的是跟蹤用戶單擊其特定ButtonApp的次數。 每次點擊后都會調用點擊++。

現在,在我看來,每次單擊按鈕時,點擊變量shoudl都會增加,因此,如果單擊左鍵,它也會增加中間和右側按鈕。

基本上我所擁有的快速短偽代碼是:

public class ButtonApp() {
    public int clicks =0;

    public static void main(String[] args) {
        //create JPanel/Frame etc etc
        panel.add(new ButtonApp());
        panel.add(new ButtonApp());
        panel.add(new ButtonApp());
    }

    public ButtonApp(){
        //creates a new button
        this.actionListener(this);
    }

    public void update(){
        clicks++;
    }

    public void actionPerformed (ActionEvent event){
        update();
    }
}

我不總是在這里增加一個clicks變量嗎?

我不總是在這里增加一個點擊變量嗎?

不,您正在處理實例變量。 每個使用new創建的對象都有一個此變量的副本

如果您將代碼更改為:

public static int clicks =0;

您確實只有一個可以多次更改的變量(靜態字段屬於該類,實例字段屬於該實例)

參考:

(全部來自Java教程>學習Java語言>類和對象部分)

new()創建類'DATA的實例 - 即任何成員變量。 代碼不重復。 在您的情況下,每個類都有自己的“點擊”成員變量。

如果你聲明的clicksstatic ,那么它將是一個“類變量”,屬於類本身而不是它的實例,然后只有一個副本。 但是,您沒有將其聲明為靜態,因此每個實例(即由new()創建的每個“事物”)都會獲得自己的副本。

對於您創建的ButtonApp的3個不同對象,將有3個單擊變量

panel.add(new ButtonApp());
panel.add(new ButtonApp());
panel.add(new ButtonApp());

如果你想計算總點擊次數,忽略哪個按鈕點擊只是使click變量static

目前,每個對象都有一個不同的click變量,但是如果你將它設置為靜態,那么每個加載的類都是相同的

另見

每個ButtonApp都有自己的clicks變量。 如果您有三個按鈕,則只需三次clicks ,並且只有按下按鈕時,給定的click才會增加。

如果您想要一個click變量,則可以將其設為類變量,而不是實例變量。 這是通過static關鍵字完成的:

private static int clicks = 0;

但總的來說,最好避免使用靜態成員。 更復雜但更靈活的方法是在要鏈接的所有按鈕之間共享計數器對象。 您可以創建自己的,但AtomicInteger非常適合,如果您要從UI線程外部訪問此狀態,則提供線程安全性。

class ButtonApp {

  private final AtomicInteger clicks;

  ButtonApp(AtomicInteger clicks) { this.clicks = clicks; }

  void update() {
    clicks.incrementAndGet();
  }

  ...

}

您可以創建ButtonApp類的三個實例,因此可以分別增加這三個屬性。

您可能會感到困惑,因為您將main方法嵌入到同一個類中,並且您認為您正在遞增與main()相關的實例的clicks屬性。

請記住mainstatic ,這意味着沒有與main相關的類的實例。 嘗試從main訪問clicks ,您會看到錯誤。

panel.add(new ButtonApp());

將通過調用zero-arg / default構造函數創建ButtonApp類的新實例

對於每個新實例,您將擁有一組新成員,包括clicks ,因此每次都為零。 您的代碼不會重復,但您將擁有此類的不同實例 ,以及它們自己的數據集。

暫無
暫無

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

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