Java只允许全局变量是静态的?

Tom*_*kie 4 java global-variables

所以我刚刚开始编写我正在编写的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) {

              }
      }

}
Run Code Online (Sandbox Code Playgroud)

Pét*_*rök 12

您的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());
  ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,这种初始化代码最好放在构造函数方法中.

顺便说一句,你引用的变量不是全局变量.现在你有尽可能多的不同framemakeMap尽可能多的情况下,PlannerMain您创建.他们将只能是"全球性"(或最接近的Java等价),如果你宣布他们public static-在这种情况下,所有PlannerMain实例将共享相同的framemakeMap,与外部世界会看到他们.


Paŭ*_*ann 5

Java中没有变量含义的全局变量,这些变量在整个程序中都是有效的.

  • 类变量:这些变量与其他语言中所谓的"全局"变量最相似.它们在具有static关键字的类中声明.整个班级只有一个变量.(如果该类将再次使用另一个类加载器加载,那么这个新类当然会有新的变量.)

    他们应使用与类前缀:MyClass.varName.在类的内部,你也可以放弃前缀,你也可以使用前缀为该类型的对象(但不鼓励这样做).

  • 实例(或对象)变量:这些是您的示例中的内容:在没有static关键字的情况下在类(以及任何方法/构造函数/块之外)中声明的任何内容都是实例变量.对于包含类的每个对象(包括此类的任何子类的对象),只有一个变量.(从"状态"视图,可以说一个对象包含其所有实例变量+一个标识.)

    它们以对象(正确类型)为前缀:myObject.varName.在这个类的非静态方法中,你可以使用它们无前缀(这是指当前对象的变量).

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

    这些的特殊情况是方法/构造函数参数和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();
   }
}
Run Code Online (Sandbox Code Playgroud)