[英]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的實例 - 即任何成員變量。 代碼不重復。 在您的情況下,每個類都有自己的“點擊”成員變量。
如果你聲明的clicks
是static
,那么它將是一個“類變量”,屬於類本身而不是它的實例,然后只有一個副本。 但是,您沒有將其聲明為靜態,因此每個實例(即由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
屬性。
請記住main
是static
,這意味着沒有與main
相關的類的實例。 嘗試從main
訪問clicks
,您會看到錯誤。
panel.add(new ButtonApp());
將通過調用zero-arg / default構造函數創建ButtonApp
類的新實例 。
對於每個新實例,您將擁有一組新成員,包括clicks
,因此每次都為零。 您的代碼不會重復,但您將擁有此類的不同實例 ,以及它們自己的數據集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.