Java только позволяет глобальным переменным быть статическими? - PullRequest
4 голосов
/ 06 февраля 2011

Итак, я только начал программировать написанную на 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 ]

12 голосов
/ 06 февраля 2011

Ваш метод main имеет значение static, поэтому он может напрямую обращаться только к полям static класса. В противном случае вам нужно сначала создать экземпляр PlannerMain, а затем получить доступ к его полям. * Т.е. 1005 *

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 вы создаете. Они будут «глобальными» (или их ближайшим эквивалентом в Java), если вы объявите их public static - в этом случае все экземпляры PlannerMain будут иметь одинаковые frame и makeMap, и внешний мир увидит их а также.

5 голосов
/ 06 февраля 2011

В Java нет глобальных переменных в значении переменных, которые будут действительны во всей программе.

Есть

  • переменные класса : Они наиболее похожи на то, что в других языках называют «глобальными» переменными.Они объявлены внутри класса с ключевым словом static.Для всего класса есть только одна переменная.(Если класс будет загружен снова с другим загрузчиком классов, этот новый класс, конечно, будет иметь новые переменные.)

    Они должны использоваться с префиксом класса: MyClass.varName.Внутри класса вы также можете отпустить префикс, и вы также можете использовать их с префиксом объекта этого типа (но это не рекомендуется).

  • экземпляр (или объект) переменные : Это то, что вы имеете в своем примере: все, что объявлено внутри класса (и вне любого метода / конструктора / блока) без ключевого слова static, является переменной экземпляра.Для каждого объекта содержащего класса (который включает в себя объекты любых подклассов этого класса) существует ровно одна переменная.(С точки зрения «состояния» можно сказать, что объект состоит из всех его переменных экземпляра + идентичность.)

    Они используются с префиксом объекта (правильного типа): myObject.varName.Внутри нестатических методов этого класса вы можете использовать их без префикса (это относится к переменным current объекта).

  • localпеременные : это все переменные, объявленные внутри метода или конструктора (или блока).Они существуют один раз для каждого вызова этого метода и перестают существовать после завершения метода.Доступ к ним можно получить только из этого метода, но не из методов, вызываемых оттуда.

    Особые случаи - это параметры метода / конструктора и catch -block-параметры.

  • элементы массива : Каждый элемент массива является переменной одного типа.Они могут использоваться везде, где есть ссылка на этот массив (часто в одном из других типов переменных).

Итак, в вашем случае у вас есть объектные переменные, и вы хотитеиспользуйте их из метода класса (статический метод).У метода класса нет текущего объекта , поэтому вы должны квалифицировать свои переменные объектом, чтобы использовать их.В зависимости от того, что вы хотите, может быть полезно написать это так:

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 голосов
/ 06 февраля 2011

В 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 создает конкретный (не-static) экземпляр вашего PlannerMain класса, чтобы он мог использовать переменные-члены.

0 голосов
/ 06 февраля 2011

Жалуется на то, что метод main является static, и вы пытаетесь получить к нему прямой доступ. Если вы создаете экземпляр вашего класса PlannerMain, вы можете получить к нему доступ без проблем.

0 голосов
/ 06 февраля 2011

если вы используете какое-либо свойство в статическом методе, то это свойство должно быть статическим.Я предполагаю, что вы используете эти глобальные переменные в методе main, поэтому Java выдает эту ошибку.Если вы все еще хотите получить доступ к глобальной переменной, то, вероятно, определите класс, который инициализируется этими глобальными переменными, и создайте его экземпляр в своей основной функции, и вы можете использовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...