2015-09-13 174 views
1

爲了學術目的,我最近被拉回到Java編程中,在第一個項目中遇到了一些有趣的事情。靜態/類變量和GUI

我不得不爲店面設計一個帶有完成各種任務的按鈕的GUI,並且我注意到我的變量發生了一些奇怪的事情。我的按鈕通過動作改變的任何CLASS VARIABLES都不需要聲明爲靜態的,而任何我感興趣的CLASS VARIABLES都必須聲明爲靜態的。

這是爲什麼?我的主要方法和ActionListener方法都處於相同的執行級別。 (他們都在同一個班級,沒有一個嵌入對方)

我希望這個問題不是太明顯/愚蠢,我想盡可能多地重新學習Java。

+0

主要方法本身是靜態的。動作監聽器方法不是。 –

+0

@SilvioMayolo那麼這是說在Java中,靜態方法只能訪問靜態(或本地)變量? – user3303680

+0

一個側面說明,但術語「類變量」用於指代靜態字段。沒有這樣的東西作爲非靜態類變量。我認爲你正在尋找「字段」或「屬性」或「屬性」一詞。 – Zarwan

回答

0

您的主要方法是靜態的,這意味着它不在對象的實例上運行,該方法在類中被調用而沒有實例化類的對象。這對主方法有一定的意義,因爲這是你程序的第一件事,所以沒有辦法實例化一個對象。

靜態方法和變量存在於類本身,而實例成員是(非靜態)變量,它們是從類創建的每個對象的一部分。每個對象都有自己的爲該類聲明的實例變量副本,爲每個對象提供自己的狀態。由於靜態變量在類上,並且只有一個類的副本(它只能由類加載器加載一次),因此每個靜態變量只有一個。

我使用「類變量」引用靜態變量,「實例變量」引用非靜態變量。

在Swing GUI編程中,使用靜態變量的原因很少,我的建議是儘可能地避免它們,因爲全局可變狀態很難調試。在Swing中,所有UI組件和偵聽器都是對象,一旦你的主要方法初始化並顯示一個主要的jframe,通常不需要其他靜態方法或變量。

+0

嗯。所以我認爲,作爲一個經驗法則,我應該避免在主要方法中加載重要的變量,這樣我就不必聲明它們是靜態的? – user3303680

+0

@ user3303680:在我編寫的swing程序中,通常主要方法只創建一個窗口並顯示它。在看不到代碼的情況下難以提供更多建議 –

+0

沒有太多細節,我在創建窗口之前將文件I/O代碼放在main方法中。這是將我的虛構商店的庫存從文本文件加載到數組中。 – user3303680