2014-01-15 74 views
1

我正在一個項目上工作,我遇到了一些我還沒完全理解的東西。總是需要靜態

每次我喜歡從另一個類調用一個方法,或者使用jform中的一個變量時,我的netbeans說我需要使它成爲「靜態」。現在我明白什麼是靜態方法,並且我已經從類中創建了使用方法的對象,但即使如此,NetBeans也表示,在MAIN()方法中使用它之前,我需要使對象成爲靜態。即使是像組合框這樣的變量變量。

有人能解釋一下嗎?

在此先感謝!

編輯:

這是我的項目的一些代碼。這是非常小的,但它應該澄清的問題:

的Mainclass:

public class SpeeloTheek { 

/** 
* @param args the command line arguments 
*/ 
public static Controller MainController = new Controller(); 
public static SummaryScreen MainSummaryScreen = new SummaryScreen(); 

public static void main(String[] args) { 
    // TODO code application logic here 
    MainSummaryScreen.setVisible(true); 
    MainController.SetFullScreen(MainSummaryScreen); 

    MainController.ComboBoxItemSelected(SummaryScreen.choiceBox); 
} 

控制器類:

package speelotheek; 

    import java.awt.event.ItemEvent; 
    import java.awt.event.ItemListener; 
    import javax.swing.JComboBox; 
    import javax.swing.JFrame; 

public class Controller { 

//Method to make JFrame fullscreen// 
public void SetFullScreen(JFrame frameToUse) { 
    frameToUse.setExtendedState(JFrame.MAXIMIZED_BOTH); 
} 

public void ComboBoxItemSelected(final JComboBox comboBoxToUse) { 

    comboBoxToUse.addItemListener(new ItemListener() { 
     @Override 
     public void itemStateChanged(ItemEvent e) { 
      if (e.getStateChange() == ItemEvent.SELECTED) { 
       WhichSummary(comboBoxToUse); 
      } 
     } 
    }); 

} 

public void WhichSummary(JComboBox comboBoxToUse) { 

    System.out.println(comboBoxToUse.getSelectedItem()); 

} 

} 

EDIT2:

感謝所有:)我發現這個問題。我在main方法中實例化類,而不是在主方法之上,它工作:)

+1

你是從班級的主要方法做到這一點嗎?試圖從你的主要方法調用一個非靜態的函數? – Hrishikesh

+0

從構造函數而不是'main' –

+0

請發佈一些錯誤發生代碼,並且完整的錯誤消息 –

回答

0

當您的主要方法,是靜態的

public static void main(String[] args){ 

} 

只能調用靜態元素,例如類,枚舉或靜態方法中工作。

如果你想從你的主要方法調用類的方法成員,你有兩個選擇

製作的方法靜態

class ClassA{ 
    public static void methodOne(){ 
    } 
} 

public static void main(String[] args){ 
    ClassA.methodOne(); 
} 

在主和呼叫實例化類非靜態方法。

class ClassA{ 
    public void methodOne(){ 
    } 
} 

public static void main(String[] args){ 
    ClassA classA = new ClassA(); 
    classA.methodOne(); 
} 

諮詢 您在使用靜態方法來照顧,因爲它們共享內存。

當您創建一個新類ClassA classA = new ClassA();時,對於您創建的每個新類,它都存儲其自己的非共享內存變量,但是當您使用靜態方法時,它們會共享可能有危險的內存。

2

爲了調用類的非靜態成員,您需要實例化一個對象。

例子:

Foo myObject = new Foo(); // myObject is an object of class Foo 

Foo.callToStaticMember(); // static members can be called using the class name 

myObject.callToNonStaticMember(); // non-static members require an object of the class 
2

這是因爲你的主要方法是靜態方法。

從靜態方法你不能調用非靜態方法或變量。 您需要將主要方法更改爲構造函數。 然後,當您創建此類的新實例時,將執行此代碼。

1

如果您嘗試從主方法訪問非靜態方法。它不會工作。原因是,靜態方法/變量不屬於類的實例。

如果您確實需要訪問另一個類的主方法中的非靜態方法。唯一的辦法就是通過班級的實例。

那麼,你就需要說

MyClass object = new MyClass(); 
object.aMethod(); 

編輯

你想對你的應用程序是所有靜態的?基本上,靜態意味着它將只有一個內存位置。所以,例如:如果用戶在一個屏幕上選擇一個單選按鈕。它會修改代碼中的值,而另一個用戶選擇另一個單選按鈕時,它將覆蓋前一個用戶的值。

你需要做的就是這樣。

public static void main(String[] args) { 
    // TODO code application logic here 
Application appObject = new Application(); 
appObject.setController(new Controller()); 
appObject.setSummaryScreen(new SummaryScreen()); // Or pass these values through a constructor. Setters are just one way to do it. Or better yet, use Spring DI. 
appObject.performAction(); 

} 

public Class Application { 


public Controller MainController ; 
public SummaryScreen MainSummaryScreen ; 

.... getters and setters of these instance variables. 

public performAction(){ 
    MainSummaryScreen.setVisible(true); 
    MainController.SetFullScreen(MainSummaryScreen); 

    MainController.ComboBoxItemSelected(SummaryScreen.choiceBox); 
} 

} 
+0

並且作爲慣例,通常不使用以大寫字母開頭的對象名 – Hrishikesh

1

如果您正在使用NetBeans GUI Builder中,你想要做的是從構造的工作,而不是main方法

public NewJFrame() { 
    initComponent(); 

    jComboBox1.addItem("Hello"); 

    // do everything with your components here 
} 

全部由GUI Builder中聲明的對象是非靜態的。他們不意味着從main訪問。