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

时间:2011-02-05 21:49:15

标签: 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) {

              }
      }

}

5 个答案:

答案 0 :(得分: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());
  ...
}

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

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

答案 1 :(得分:5)

在Java中没有全局变量,这些变量在整个程序中都有效。

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

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

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

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

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

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

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

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

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

答案 2 :(得分:2)

在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类的具体(非静态)实例,以便它可以使用成员变量。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

由于main方法为static并且您尝试直接访问它,因此抱怨。如果您创建了班级PlannerMain的实例,则可以毫无问题地访问。