【问题标题】:Always need to make static总是需要做静态
【发布时间】:2023-04-02 21:44:01
【问题描述】:

我正在做一个项目,但我遇到了一些我还不完全理解的东西。

每次我喜欢从另一个类调用方法,或者使用 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());

}

}

编辑2:

谢谢大家 :) 我找到了问题。我在 main 方法中实例化了该类,而不是在 main 方法之上,它起作用了:)

【问题讨论】:

  • 你是从类的main方法做的吗?尝试从您的 main 方法调用非静态函数?
  • 从构造函数而不是main工作
  • 请贴出出现错误的代码,以及完整的错误信息

标签: java class object netbeans static


【解决方案1】:

为了调用类的非静态成员,您需要实例化一个对象。

例子:

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】:

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

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

    【讨论】:

      【解决方案3】:

      如果您使用的是 Netbeans GUI Builder,您要做的是从构造函数中工作,而不是 main 方法

      public NewJFrame() {
          initComponent();
      
          jComboBox1.addItem("Hello");
      
          // do everything with your components here
      }
      

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

      【讨论】:

        【解决方案4】:

        如果您尝试从主方法访问非静态方法。它行不通。原因是,静态方法/变量不属于类的实例。

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

        所以,你需要说

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

        【讨论】:

        • 作为惯例,一般不要使用以大写字母开头的对象名
        【解决方案5】:

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

        public static void main(String[] args){
        
        }
        

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

        如果你想从你的主方法调用一个类的方法成员,你有两个选择

        将方法设为静态

        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(); 时,对于您创建的每个新类,它都会存储自己的非共享内存变量,但是当您使用静态方法时,它们会共享内存,这可能很危险。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-02
          • 1970-01-01
          • 2016-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多