簡體   English   中英

Java只允許全局變量是靜態的?

[英]Java only allowing global variables to be static?

所以我剛剛開始編寫我正在編寫的 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關鍵字聲明。 整個班級只有一個變量。 (當然,如果用另一個類加載器再次加載該類,這個新類將有新的變量。)

    它們應該以類為前綴使用: 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 方法中使用了這些全局變量,因此 java 拋出了這個錯誤。 如果你仍然想訪問一個全局變量,那么可能定義一個用這些全局變量初始化的類,並在你的主函數中實例化它,你可以使用它。

它抱怨因為main方法是static而您試圖直接訪問它。 如果您創建類PlannerMain的實例,則可以毫無問題地訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM