在java中访问静态变量时,是否在内存中加载了一个类?

时间:2014-01-21 05:16:02

标签: java java-ee static-variables

我有一个班级:

public class Foo {
    public static boolean flag = false;
    //some code
}

我在另一个类中使用此boolean标志:

public class FooImpl{
    public static void main (String args[]) {
        if (Foo.flag){
            //Line 1
            //some code
        }
    }
}

所以在Line 1,类Foo是否在内存中完全加载,或者只是静态变量加载了默认值?

2 个答案:

答案 0 :(得分:3)

类静态初始化通常在第一次发生以下事件之一之前发生:

  • 创建了一个类的实例,
  • 调用类的静态方法
  • 分配了类的静态字段,
  • 使用非常量静态字段,或

请参阅JLS 12.4.1

答案 1 :(得分:-3)

当有对类的静态引用时,类会被加载。它由ClassLoader [java.lang.ClassLoader]加载。

当您访问类成员或构造函数[创建该类的实例]时,您需要有关该类的信息并加载它。

对于某些库函数调用,您可能已经看到了一些ClassNotFoundException。 ClassLoader就在后面。

但是还有一个事实是,当首先使用类中的某些东西时,类会被初始化。

Initialization of a class consists of executing its static initializers and the initializers

表示在类中声明的静态字段(类变量)。

在第1行中,您指的是类的成员,并且肯定会加载

初始化发生:

T是一个类,并创建了一个T实例。

  • T是一个类,调用T声明的静态方法。
  • 分配由T声明的静态字段。
  • 使用由T声明的静态字段,该字段不是常量变量
  • T是顶级类,并且执行词法嵌套在T中的断言语句。

对静态字段的引用(第8.3.1.1节)仅导致类或类的初始化 实际声明它的接口,即使它可能通过引用 子类的名称,子接口或实现接口的类。