总是需要静电

时间:2014-01-15 08:45:41

标签: java class object netbeans static

我正在开展一个项目,但我遇到了一些我还不完全了解的事情。

每当我想从另一个类调用一个方法,或者使用jform中的一个变量时,我的netbeans就说我需要做一个"静态"。现在我理解静态意味着什么,并且我已经从使用方法的类中创建了对象,但即便如此,netbeans也说我需要先使对象静态,然后才能在MAIN()方法中使用它。甚至像组合框这样的jform变量。

有人可以解释一下吗?

提前谢谢!

编辑:

这是我项目中的一些代码。它非常小但它应该澄清问题:

主要类:

    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方法中实例化了类,而不是在main方法之上,它起作用了:)

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这是因为你的main方法是静态方法。

从静态方法中,您无法调用非静态方法或变量。 您需要将main方法更改为构造函数。 然后,当您创建此类的新实例时,将执行此代码。

答案 2 :(得分:1)

如果您尝试从main方法访问非静态方法。它不会起作用。原因是,静态方法/变量不属于类的实例。

如果确实需要在另一个类的main方法中访问非静态方法。唯一的方法是通过类的实例。

所以,你需要说

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);
}

}

答案 3 :(得分:1)

如果您正在使用Netbeans GUI Builder,那么您要做的是使用构造函数而不是main方法

public NewJFrame() {
    initComponent();

    jComboBox1.addItem("Hello");

    // do everything with your components here
}

GUI Builder声明的所有对象都是非静态的。它们不是要从main访问它们。

答案 4 :(得分:0)

当你在main方法中工作时,这是静态的

public static void main(String[] args){

}

你只能调用静态元素,例如类,枚举或静态方法。

如果要从main方法调用类的方法成员,则有两个选项

使方法成为静态

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

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

在main中实例化该类并调用非静态方法。

class ClassA{
    public void methodOne(){
    }
}

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

<强>建议 使用静态方法时必须小心,因为它们共享内存。

当你创建一个新类ClassA classA = new ClassA();时,对于你创建的每个新类,它会存储自己的非共享内存变量,但是当你使用静态方法时,它们会共享可能很危险的内存。