所以我刚刚开始编写我正在编写的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) {
}
}
}
答案 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
实例数量与makeMap
和PlannerMain
不同。如果您声明它们public static
,它们将只是“全局”(或其在Java中最接近的等价物) - 在这种情况下,所有PlannerMain
实例将共享相同的frame
和makeMap
,外部世界也会看到它们。
答案 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
的实例,则可以毫无问题地访问。