Подтвердить что ты не робот

Как создать статическую локальную переменную в Java?

Я читал, что Java не поддерживает локальные переменные static, отличные от C/С++. Теперь, если я хочу закодировать функцию с локальной переменной, значение которой должно сохраняться между вызовами функций, как это сделать?
Должен ли я прибегать к использованию переменных экземпляра?

4b9b3361

Ответ 1

У вас может быть статическая переменная класса, которая будет сохранена во всех экземплярах класса. Если это то, что ты хочешь. Если нет, используйте переменную экземпляра, которая будет сохранена только для вызовов методов этого объекта.

public class Foo {
   static int bar;
   //set bar somewhere

   public int baz() {
      return 3 * bar;
   }
} 

Ответ 2

Локальные переменные являются переменными внутри метода. Доступ к этим переменным может получить только метод. вы не можете иметь статическую локальную переменную, но вы можете использовать переменные экземпляра или переменные класса.

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

Ответ 3

Должен ли я прибегать к использованию экземпляра переменные?

yes - в конце концов, для этого нужны переменные экземпляра. Они сохраняют состояние между вызовами методов объекта. Наличие статических переменных класса может привести к одному и тому же результату, но может сделать вашу программу более сложной и сложной для тестирования/макета/поддержки.

Ответ 4

Если вы хотите повторно использовать значение переменной между вызовами функций и изолировать эту переменную от других методов, вы должны инкапсулировать ее в объект. Сначала определите класс с только "статическими" переменными и нужную функцию:

class MyFunctionWithState {
    private int myVar = 0;
    public int call() {
      myVar++;
      return myVar;
    }
 }

Затем из вашего кода клиента:

class Foo {
    private MyFunctionWithState func = new MyFunctionWithState();
    public int bar() {
      return func.call();
    }
 }

Теперь, если func опирается на внутреннее состояние Foo, вы можете передать соответствующие данные через call() или передать экземпляр Foo и позволить функции вызвать соответствующие геттеры:

class MyFunctionWithState {
    private int myVar = 0;
    public int call( Foo f ) {
      myVar += f.getBaz();
      return myVar;
    }
 }

class Foo {
    private MyFunctionWithState func = new MyFunctionWithState();
    public int bar() {
      return func.call( this );
    }
    public int getBaz() {  /*...*/  }
 }

Ответ 5

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

Для людей из C-фона, подобного мне, по-настоящему желая статические функции-локальные переменные, исключительно для преимуществ области по сравнению с глобальными, кажется, что вы не можете на Java. Не без выполнения чего-то вроде @paradigmatic происходит с экземпляром класса со статическим глобальным и getter(), уникальным для экземпляра класса, в котором вы используете свою функцию.

Если, как я подозреваю, вы используете класс как Singleton или полностью статично, как программист с очень сложными процедурами, мы все начали, поскольку ответ @Ellie P или @user2626445 будет работать нормально, поскольку ни один другой экземпляр не будет винить ваш глобальный. Но для достижения того, что, по вашему мнению, вы хотите, это должна быть просто переменная экземпляра, которая является глобальной в C. Они сохраняются во всех вызовах функций, но позволяют использовать вашу функцию в OO-способе, поэтому несколько экземпляров могут сохранять свои собственные постоянные переменные для этой конкретной функции.

Лично я обойду это в jave так же, как и Hi-Tech C, не позволяя переменным бита функции, объявив глобальное значение в файле чуть выше объявления функции. Таким образом, я, когда я буду взломать код позже, с меньшей вероятностью подумает, что это глобальный, и соблазн с ним поработать - разве мы не инкапсулируем вещи?

Ответ 6

В следующем примере count ведет себя как статическая локальная переменная, которую вы можете использовать в C:

public class Foo {

   private int count = 0;

   public int getCount() {
       return count++;               
   }
} 

Нет статических локальных переменных, таких как поддержка других языков. Так как java очень "class" -ориентирован, он пытается привести его в этот контекст. Если вы хотите имитировать это поведение, вы используете переменную экземпляра, которая используется только этим методом. Таким образом, это статично для разных вызовов методов, а не для самого класса.

Ответ 7

final int intVar = 1;//Будет введен только один раз. Ведет себя как статический локальный var С++ в методе.