静态类变量是在调用静态方法时创建的-Java

静态类变量是在调用静态方法时创建的-Java,java,model-view-controller,static,controller,Java,Model View Controller,Static,Controller,我有一个控制器类,它既有静态变量也有非静态变量和方法 public class Controller { // Model that will be used throughout the program private static Model model; private static ArrayList<Model> modelList = new ArrayList<Model>(); // User Views pri

我有一个控制器类,它既有静态变量也有非静态变量和方法

public class Controller 
{
    // Model that will be used throughout the program
    private static Model model;
    private static ArrayList<Model> modelList = new ArrayList<Model>();

    // User Views
    private static OpenProgramView initialView = new OpenProgramView();
    private DriverProfileView driverProfileView;
}
我遇到的问题是,当我使用前一行代码时,它似乎调用了私有静态对象的一个新实例——OpenProgramView。我之所以知道这一点,是因为它在测试过程中弹出,而不应该弹出。我还将其他视图从非静态更改为静态,以查看会发生什么,当我使用静态方法时,它们也会弹出,但非静态视图不会弹出

我的问题-为什么会发生这种情况?似乎当我调用一个静态方法时,它正在创建控制器中所有静态类变量的新实例,并且正在创建一个问题

编辑:

我没有指定只有在测试这个特定的代码片段时才会发生这种情况。当这个问题发生时,我还没有创建控制器对象,因此我第一次接触控制器类是调用静态方法


当我在测试模式下运行程序并实际将其用于功能目的时——在创建程序时已经创建了一个控制器对象,因此,调用静态方法后不会出现此问题,因为这不是我第一次“接触”类。感谢您的帮助。

这是因为第一次接触类时(调用方法、访问字段或创建对象),所有静态字段都将初始化

Java语言规范保证了这一点,您不能对此做太多:

  • 将修改器更改为非静态或
  • 懒洋洋地初始化视图

    • 这是因为第一次接触类时(调用方法、访问字段或创建对象),所有静态字段都将初始化

      Java语言规范保证了这一点,您不能对此做太多:

      • 将修改器更改为非静态或
      • 懒洋洋地初始化视图

      了解Java类中的静态初始化此问题不应出现,可能您正在执行未显示的
      getModel
      static方法中的其他操作,因此产生了问题。请添加更多描述。阅读Java类中的静态初始化。这个问题不应该出现。可能您正在
      getModel
      static方法中执行未显示的其他操作,从而产生了问题。请添加更多描述。是的,理论不错,但是OP的问题是不同的:当我调用一个静态方法时,它似乎正在创建一个所有静态类的新实例variables@LuiggiMendoza当前位置仔细阅读答案,他是正确的。静态变量绑定到.class实例本身。当类加载器首次加载类时,所有静态字段都将初始化。这就是为什么你永远不应该依赖静态来连接你的东西的部分原因——初始化顺序会把事情搞得一团糟。使用像Guice或Spring这样的依赖注入框架。@Gergely这就是为什么我说了好的理论,但这并不能为问题提供真正的解决方案。这就证实了OP的问题在别的地方。解决方案是:将这些静态元素移到控制器外部或类似的地方。AFAICS,这只是一个很长的评论,不是答案。@LuiggiMendoza问题的字面意思是“为什么会发生这种情况?”。答案解释了为什么会发生这种情况。是的,理论不错,但OP的问题不同:当我调用静态方法时,它似乎正在创建所有静态类的新实例variables@LuiggiMendoza当前位置仔细阅读答案,他是正确的。静态变量绑定到.class实例本身。当类加载器首次加载类时,所有静态字段都将初始化。这就是为什么你永远不应该依赖静态来连接你的东西的部分原因——初始化顺序会把事情搞得一团糟。使用像Guice或Spring这样的依赖注入框架。@Gergely这就是为什么我说了好的理论,但这并不能为问题提供真正的解决方案。这就证实了OP的问题在别的地方。解决方案是:将这些静态元素移到控制器外部或类似的地方。AFAICS,这只是一个很长的评论,不是答案。@LuiggiMendoza问题的字面意思是“为什么会发生这种情况?”。答案解释了它发生的原因。
      int askYear = Controller.getModel().getYear();