Как получить доступ к глобальной переменной non stati c из метода stati c - PullRequest
0 голосов
/ 28 мая 2020

У меня есть основной метод в моей программе java, я хочу сохранить значения в глобальной переменной, потому что я хочу получить доступ к этим значениям из разных методов класса, однако я не уверен, что использовать глобальную переменную stati c, поскольку значения в переменной продолжают меняться, поэтому я боюсь, что значения, объявленные как stati c, могут не измениться, поскольку они определены на уровне класса, поэтому я ищу глобальную переменную non stati c. Может кто подскажет, как этого добиться.

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Поскольку Java способствует использованию классов, а не глобальных переменных, я настоятельно рекомендую вам использовать класс для хранения данных. Таким образом, вам не нужно использовать методы stati c или переменные stati c.

Пример этого показан ниже:

import java.util.*;
public class Main{
    public static void main(String[] args) {
        int initialValue = 1;
        Holder holder = new Holder(initialValue);

        int currentValue = holder.getValue();
        System.out.println("Value after initial creation: " + currentValue);

        System.out.println("Set value to 10");
        holder.setValue(10);

        currentValue = holder.getValue();
        System.out.println("New value is " + currentValue);
    }
}

Класс-держатель:

public class Holder {
        private int val;
        public Holder(int value){
            setValue(value);
        }
        public void setValue(int value){
            this.val=value;
        }
        public int getValue(){
            return this.val;
        }
    }
1 голос
/ 28 мая 2020

Я предлагаю вам создать отдельный класс с переменными, которые вы хотите сохранить, с соответствующими методами получения и установки. Таким образом, вы сохраняете код более чистым и поддерживаемым, и вы следуете принципу разделения проблем, который говорит нам, что каждый класс должен иметь собственное назначение.

EG:

 public class Person {
   private String name; // private = restricted access

   // Getter
   public String getName() {
   return name;
   }

  // Setter
  public void setName(String newName) {
  this.name = newName;
  }
}

 public class MyClass {
   public static void main(String[] args) {
     Person myObj = new Person();
     myObj.setName("John"); // Set the value of the name variable to "John"
     System.out.println(myObj.getName()); //Prints out name value
   }
 }
0 голосов
/ 28 мая 2020

Для запуска класса java используется "основной" метод stati c, присутствующий во всех обычных java программах. ОДНАКО, метод «конструктор» (на самом деле просто «конструктор») назван в честь имени «основного класса» и именно там вы инициализируете переменные независимо от того, вызываете ли вы объявленный метод в классе или получаете переменную stati c из стартового метода. "main".

Основной метод не требует какого-либо метода прохождения для получения из него переменной stati c для установки глобальной переменной stati c в классе, потому что это только 1 шаг в иерархии «область видимости» в классе (вот почему некоторые фреймворки передают переменные в глобальные без ввода метода, а вместо этого используют «void» в объявлении метода) НО вы не можете поместить вызов нестатического c метода в stati c раздел кода, такой как основной метод.

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

например, для глобальной переменной типа String из основного метод во время создания глобально объявить

static String uselessRef1 = ""; //  declared globally initialised

// following is declared inside the static method main
uselessRef1 = args[1]; // static argument 1 from the main method args[] array

// following is declared in global scope code or in the constructor code
    String uselessRef1b = (String)uselessRef1; // (String) cast removes the static context of the String type and copies to non static version of the type

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

NB: вы можете поставить или создайте метод stati c в классе non-stati c, но не сделайте метод non stati c в классе stati c.

import.javax.swing.*;
public class ExampleStaticRemoval{
static String uselessRef1 = ""; //  declared globally initialised
String uselessRef1b = ""; 
ExampleStaticRemoval(){

// following is declared in global scope code or in the constructor code
    uselessRef1b = (String)uselessRef1; // (String) cast removes the static context of the String type and copies to non static version of the type 
    printOut();

}// end constructor



    // program start method
    public static void Main(String[] args){
    new ExampleStaticRemoval();
        // static global class variable uselessRef1 is assigned the local method value
    // MUST BE OUTSIDE AT TOP TO BE GLOBAL
        uselessRef1 = args[0] +"  "+args[1]; // join static arguments 0 and 1 from the main method args[] array

}// end main



    public void printOut(){
    JOptionPane.showConfirmDialog(null,uselessRef1b, uselessRef1b, 0);
}//end method


} // end class
...