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

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

您的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 ,外部世界也会看到它们。

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

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

    它们应该使用前缀为类: 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(); } } 

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

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

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