【问题标题】:Java only allowing global variables to be static?Java只允许全局变量是静态的?
【发布时间】:2020-10-20 02:59:15
【问题描述】:

所以我刚开始编写我正在编写的 Java 程序,它告诉我我的全局变量需要是静态的。我不明白为什么它告诉我这个,因为我以前开发过 Java 程序,而不必使我的全局变量成为静态的。有人可以帮忙吗?

 import java.awt.event.*;
 import javax.swing.*;

 public class PlannerMain {
      JFrame frame;
      JButton makeMap;

      public static void main(String[] args){
           frame = new JFrame("Land Planner");
           makeMap = new JButton("Make Map");
           makeMap.addActionListener(new makeMapListener());
           frame.setSize(580,550);
           frame.setVisible(true);
      }

      class makeMapListener implements ActionListener{

              public void actionPerformed(ActionEvent e) {

              }
      }

}

【问题讨论】:

  • 仅供参考,在 Java 中,使变量“全局”的原因是将其标记为静态。从技术上讲,它的范围是一个类,而不是像 C/C++ 中的“老派”全局,但仍然是唯一的方法。你不能有非静态全局变量,所以我猜你可能没有使用正确的术语。

标签: java global-variables


【解决方案1】:

你的main方法是static,所以它只能直接访问类的static字段。否则,您需要先创建PlannerMain 的实例,然后才能访问其字段。即

public static void main(String[] args){
  PlannerMain planner = new PlannerMain();
  planner.frame = new JFrame("Land Planner");
  planner.makeMap = new JButton("Make Map");
  planner.makeMap.addActionListener(new makeMapListener());
  ...
}

注意,这样的初始化代码最好放在构造函数方法中。

顺便说一句,您引用的变量不是全局的。现在,您创建的 PlannerMain 实例与您创建的 framemakeMap 实例一样多。如果您将它们声明为 public static,它们只会是“全局的”(或其在 Java 中最接近的等价物)——在这种情况下,所有 PlannerMain 实例将共享相同的 framemakeMap,并且外部世界会看到它们也是。

【讨论】:

    【解决方案2】:

    Java 中没有全局变量是指在整个程序中有效的变量。

    • 类变量:这些与其他语言中所谓的“全局”变量最相似。它们在一个带有static 关键字的类中声明。整个班级只有一个变量。 (如果这个类会被另一个类加载器再次加载,这个新类当然会有新的变量。)

      它们应该与类一起使用:MyClass.varName。在类内部,你也可以省略前缀,你也可以使用前缀为该类型的对象(但不鼓励这样做)。

    • instance(或对象)variables:这些是您在示例中所拥有的:在类内(以及在任何方法/构造函数/块之外)声明的任何内容static 关键字是一个实例变量。对于包含类的每个对象(包括此类的任何子类的对象),只有一个变量。 (从“状态”的角度来看,可以说一个对象由它的所有实例变量 + 一个身份组成。)

      它们以对象(正确类型)为前缀:myObject.varName。在此类的非静态方法中,您可以不加前缀使用它们(这指的是 current 对象的变量)。

    • 局部变量:这些都是在方法或构造函数(或块)内声明的变量。每次调用此方法时它们都存在一次,并在方法完成后不再存在。它们只能从这个方法/块内部访问,而不是从那里调用的方法。

      这些的特殊情况是方法/构造函数参数和catch-block-parameters。

    • 数组元素:数组的每个元素都是同类型的变量。它们可以在引用该数组的任何地方使用(通常在其他类型的变量中),使用括号中的索引。

    因此,在您的情况下,您有对象变量,并希望从 类方法(静态方法)中使用它们。类方法没有当前对象,因此您必须使用对象限定变量才能使用它们。根据您的需要,以这种方式编写它可能会很有用:

    import java.awt.event.*;
    import javax.swing.*;
     
    public class PlannerMain {
       JFrame frame;
       JButton makeMap;
       
       void initGUI() {
         frame = new JFrame("Land Planner");
         makeMap = new JButton("Make Map");
         makeMap.addActionListener(new makeMapListener());
         frame.setSize(580,550);
         frame.setVisible(true);
       }
    
       public static void main(String[] args){
         PlannerMain pm = new PlannerMain();
         pm.initGUI();
       }
    }
    

    【讨论】:

      【解决方案3】:

      在 java 中,入口点 - main 方法必须是静态的,因此它访问的任何类变量也必须是静态的。

      为了避免静态成员变量在整个代码中产生(这很糟糕),请执行以下操作:

      public class PlannerMain {
      
       JFrame frame;
      
       JButton makeMap;
      
       public static void main(String[] args){
           PlannerMain theApp = new PlannerMain();
           theApp.init();
       }
      
       private void init() {
           frame = new JFrame("Land Planner");
           makeMap = new JButton("Make Map");
           makeMap.addActionListener(new makeMapListener());
           frame.setSize(580,550);
           frame.setVisible(true);
       }
      
       class makeMapListener implements ActionListener{
      
          public void actionPerformed(ActionEvent e) {
      
      
      
              }
      
          }
      }
      

      现在您的静态 main 方法会创建您的 PlannerMain 类的具体(非静态)实例,以便它可以使用成员变量。

      【讨论】:

        【解决方案4】:

        这是因为 main 方法是 static 而你试图直接访问它。如果你创建了你的类PlannerMain 的一个实例,你就可以毫无问题地访问。

        【讨论】:

          【解决方案5】:

          如果您在静态方法中使用某些属性,则该属性应该是静态的。我猜你在 main 方法中使用了这些全局变量,因此 java 抛出了这个错误。如果你仍然想访问一个全局变量,那么可能定义一个用这些全局变量初始化的类,并在你的主函数中实例化它,你可以使用它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-06-12
            • 1970-01-01
            • 2022-01-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多