精华内容
下载资源
问答
  • 我想知道何时将静态变量初始化为其默认值。加载类时是否创建(分配)了静态var是否正确,然后执行静态初始化程序和声明中的初始化?在什么时候给出默认值? 这导致前向参考的问题。另外,如果您可以参考"为什么不及时...

    我想知道何时将静态变量初始化为其默认值。

    加载类时是否创建(分配)了静态var是否正确,

    然后执行静态初始化程序和声明中的初始化?

    在什么时候给出默认值? 这导致前向参考的问题。

    另外,如果您可以参考"为什么不及时初始化静态字段?"这一问题进行解释, 尤其是Kevin Brock在同一网站上给出的答案。 我不明白第三点。

    请您编辑您的问题以包括您所引用的报价。

    您阅读过Java语言规范吗? 故意如此,这是一个易于阅读的文档。 如果您已阅读该书,则可能了解发生了什么。 如果没有,您至少可以问一个更具体的问题...

    我认为此问答是stackoverflow.com/questions/3499214的一个重复说明。

    从请参阅Java静态变量方法:

    It is a variable which belongs to the class and not to object(instance)

    Static variables are initialized only once , at the start of the execution. These variables will be initialized first, before the initialization of any instance variables

    A single copy to be shared by all instances of the class

    A static variable can be accessed directly by the class name and doesn’t need any object.

    如果您没有故意将实例和类(静态)变量初始化为标准默认值,则将它们自动初始化为标准默认值。尽管局部变量不会自动初始化,但是您无法编译在使用局部变量之前无法初始化局部变量或为该局部变量赋值的程序。

    编译器实际上所做的是内部生成一个单一的类初始化例程,该例程将所有静态变量初始化器和所有静态初始化器代码块按它们在类声明中出现的顺序组合在一起。第一次加载该类时,此单个初始化过程仅自动运行一次。

    对于内部类,它们不能具有静态字段

    An inner class is a nested class that is not explicitly or implicitly

    declared static.

    ...

    Inner classes may not declare static initializers (§8.7) or member interfaces...

    Inner classes may not declare static members, unless they are constant variables...

    请参见JLS 8.1.3内部类和封闭实例

    Java中的final字段可以与其声明位置分开进行初始化,但这不适用于static final字段。请参见下面的示例。

    final class Demo

    {

    private final int x;

    private static final int z;  //must be initialized here.

    static

    {

    z = 10;  //It can be initialized here.

    }

    public Demo(int x)

    {

    this.x=x;  //This is possible.

    //z=15; compiler-error - can not assign a value to a final variable z

    }

    }

    这是因为与类型相关联的static变量只有一个副本,而不是与实例变量相关联的与该类型的每个实例相关联的副本,并且如果我们尝试在构造函数中初始化类型为static final的z ,它将尝试重新初始化static final类型的字段z,因为构造函数是在类的每个实例上运行的,而静态final字段上不得出现该实例。

    In case of static inner classes, they can not have static fields似乎是一个错字。内部类是非静态的。

    您应该使用但是而不是

    当您启动JVM并首次加载类时(这是通过以任何方式首次引用该类时由类加载器完成的操作),所有静态块或字段都将加载到JVM中并可以访问。

    不幸的是,这个答案在初始化静态变量时包含一些事实上的错误。请参阅stackoverflow.com/a/3499322/139985。

    看到:

    JLS 8.7,静态初始化程序

    JLS 12.2,加载类和接口

    JLS 12.4,类和接口的初始化

    最后一个特别提供了详细的初始化步骤,这些步骤详细说明了何时初始化静态变量以及初始化的顺序(请注意,final类变量和作为编译时常量的接口字段首先被初始化。)

    我不确定您对第3点的具体问题是什么(假设您是说嵌套的?)。详细序列说明这将是递归初始化请求,因此它将继续初始化。

    当类加载器加载该类时,将初始化静态字段。此时将分配默认值。按照它们在源代码中出现的顺序进行操作。

    初始化的顺序为:

    静态初始化块

    实例初始化块

    建设者

    JVM规范文档中说明了该过程的详细信息。

    从另一个问题的代码开始:

    class MyClass {

    private static MyClass myClass = new MyClass();

    private static final Object obj = new Object();

    public MyClass() {

    System.out.println(obj); // will print null once

    }

    }

    对该类的引用将开始初始化。首先,该类将被标记为已初始化。然后,将使用MyClass()的新实例初始化第一个静态字段。请注意,立即为myClass提供了对空白MyClass实例的引用。有空格,但是所有值都为空。现在将执行构造函数并显示obj,该值为null。

    现在回到初始化类:obj被引用为一个新的真实对象,我们完成了。

    如果通过以下语句取消了此设置:MyClass mc = new MyClass();将为新的MyClass实例分配空间(并将引用放置在mc中)。构造函数将再次执行,并再次打印obj,现在它不为null。

    真正的窍门是,当您使用new时(如在WhatEverItIs weii = new WhatEverItIs( p1, p2 ); weii中一样),将立即获得对一些空内存的引用。然后,JVM将继续初始化值并运行构造函数。但是,如果您以某种方式引用weii之前(例如,通过另一个线程进行引用或通过类初始化进行引用),则您正在查看的是填充有空值的类实例。

    在初始化完成之前,不会将类标记为已初始化-否则将没有任何意义。标记为已初始化几乎是最后一步。参见JLS 12.4.2。

    @DaveNewton:一旦有人引用了该类并开始对其进行初始化,则所有其他引用将把该类视为已初始化。他们不会尝试初始化它,也不会等待它被初始化。因此,从程序开始看似非空的字段实际上可以在一段时间内为空。不理解这是造成所有混乱的原因。我认为最简单的说法是,未初始化的类在第一个引用上被"标记"为已初始化,所有其他引用都将其视为已初始化,这就是为什么会发生这种情况。

    对先前注释的更正:如Dave Newtons JLS 12.4.2所述,该类在初始化时被锁定。其他线程将等待该类被初始化。但是,这并不影响这种情况,它们都在一个线程中发生。

    静态变量可以通过以下三种方式初始化,如下所示,选择任意一种

    您可以在声明时将其初始化

    或者您可以通过制作静态块来实现,例如:

    static {

    // whatever code is needed for initialization goes here

    }

    静态块有替代方法-您可以编写私有的静态方法

    class name {

    public static varType myVar = initializeVar();

    private static varType initializeVar() {

    // initialization code goes here

    }

    }

    静态变量

    它是一个属于类而不属于对象(实例)的变量

    静态变量仅在执行开始时初始化一次(当Classloader首次加载类时)。

    在初始化任何实例变量之前,将首先初始化这些变量

    该类的所有实例共享一个副本

    可以通过类名称直接访问静态变量,并且不需要任何对象

    展开全文
  • 1. 静态变量初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。 2. 静态变量初始化一次,但可以通过赋值的方式多次修改静态变量的值。 3. 全局变量和静态变量 在进入 main 前被初始化
    1. 静态变量的初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。
    
    2. 静态变量只初始化一次,但可以通过赋值的方式多次修改静态变量的值。
    3. 全局变量和静态变量 在进入 main 前被初始化
    展开全文
  • 首先我们都知道静态变量是随着类的加载而加载的,所以当类加载进内存的时候静态变量就已经伴随着类的加载而初始化进内存了,并且静态变量只在类加载时加载一次,存放在方法区中的静态区中。 再者就是全局变量也...

    首先我们都知道静态变量是随着类的加载而加载的,所以当类加载进内存的时候,静态变量就已经伴随着类的加载而初始化进内存了,并且静态变量只在类加载时加载一次,存放在方法区中的静态区中。

    再者就是全局变量也就是成员变量,全局变量(成员变量)是在创建对象的时候初始化的,所以只要创建对象就会初始化全局变量(成员变量),并存放在堆内存中。

    展开全文
  • 全局变量和静态(全局和局部)变量 什么时候初始化? 本文链接:https://blog.csdn.net/sunny04/article/details/18605273 1. 静态变量初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。 2. 静态变量只...

    全局变量和静态(全局和局部)变量 什么时候初始化?

    本文链接:https://blog.csdn.net/sunny04/article/details/18605273

    1. 静态变量的初始化是在编译时进行,变量的赋值是在函数或程序运行时进行。
    2. 静态变量只初始化一次,但可以通过赋值的方式多次修改静态变量的值。
    3. 全局变量和静态变量 在进入 main 前被初始化

    展开全文
  • 我们知道一个类(class)要被使用必须经过装载,连接,初始化这样的过程。下面先对这三阶段做一个简单的描述,之后会结合一个简单的例子来说明java中类的初始化过程。 在装载阶段,类装载器(Bootstrap ClassLoader ...
  • 详细介绍了Java的静态成员变量静态数据块、非静态成员变量和非静态成员变量初始化顺序
  • 一定要记得初始化,对于静态变量,不然编译通不过 void DbUtil::setCheckNameStat(QString checkNameTemp){ checkNameT = checkNameTemp; qDebug(); } 转载于:...
  • 类的静态成员变量初始化时间

    千次阅读 2020-05-02 14:28:37
    首先先搞明白 声明、定义、初始化 ...类静态成员变量在main函数执行前完成初始化,有静态初始化和动态初始化 static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero initialization 和...
  • 静态变量初始化的时机

    千次阅读 2017-10-02 16:40:48
    静态变量的内存分配和初始化 对于C语言的全局和静态变量,不管是否被初始化,其内存空间都是全局的;如果初始化,那么初始化发生在任何代码执行之前,属于编译期初始化。由于内置变量无须资源释放操作,仅需要...
  • 全局变量,static变量初始化时间

    万次阅读 2019-04-24 22:04:41
    首先,静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C和C++中静态局部变量初始化节点又有点不太一样。在C中,初始化发生在代码执行之前,编译阶段分配...
  • 通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
  • C++中static变量初始化

    千次阅读 2020-03-28 19:07:36
    } 输出结果: x = 5, y = 5 x = 6, y = 6 x = 7, y = 7 x = 8, y = 8 x = 9, y = 9 通过两个例子的结果我们可以知道,静态变量初始化就是通过静态变量后面的一个32位内存位来做记录,以标识这个静态变量是否已经...
  • 什么时候初始化 根据 C++ 标准,全局变量初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时...
  • 易语言静态变量初始化源码,静态变量初始化,静态变量初始化例子
  • C语言静态变量初始化问题

    千次阅读 2018-02-10 12:45:45
     这是一行很正常的代码,但是我“细心”的发现作者在使用它的时候并没有初始化。书上的解释是,用static修饰的变量会自动初始化。  为什么会被初始化呢?首先我们看一段话: 可执行程序和内存映像的区别在于:可...
  • C++静态成员变量初始化

    千次阅读 2021-06-17 10:35:00
    静态成员变量初始化 静态成员变量可以初始化,但只能在类体外进行初始化。如: long long student::number = 13926572996; //在类体外对静态成员变量赋值 其一般形式为: 数据类型 类名::静态成员变量名 = ...
  • java基础-延伸,变量初始化顺序从这篇文章java基础-反射1(类型信息,Class对象简介,Class对象初始化) 我们可以了解到类在第一次使用时类加载到内存中的顺序有三个步骤 类的加载:由类加载器执行,根据类名查找...
  • Spring中,给静态变量初始化的问题

    千次阅读 2017-04-28 11:42:59
    1)在指定方法上加上@PostConstruct 注解来指定该方法是在bean初始化之后调用 2)在指定方法上加上@PreDestroy 注解来指定该方法是在bean销毁之前调用 方案三:使用@PostConstruct注解 首先,声明一个静态变量...
  • 在工具类中,通常会初始化一些单例变量,这些变量由于只会初始一次,并不适合放在构造函数中,因此通常选择在静态代码块中执行,那么在一个类中,就会涉及到静态变量和静态代码块的初始化执行顺序问题。 public ...
  • 对于一个类的静态变量何时初始化,大家都有一个普遍的共识,那就是第一次使用该类时,初始化该类的所有静态变量和静态方法。 /// /// 只有在第一次使用到Test1的时候,才会初始化Test1.x /// class Test1 { ...
  • 我们知道C++类的静态成员变量是需要初始化的,但为什么初始化呢。其实这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。两者的区别在于:初始化是...
  • Java静态变量初始化

    千次阅读 2019-06-28 01:12:53
    静态变量初始化方式 在静态变量的声明时初始化 在静态代码块中初始化 静态变量初始化时机 在类的生命周期内,静态变量只会被初始化一次。 静态变量初始化时机需要分情况讨论 静态变量类型 初始化时机 ...
  • int a; main() { ...我们所理解的静态变量b,只知道它在上面的函数内部只初始化一次,其实是个假像 ,我要表达的是,事实上b初始化的值,不是在循环体完成的.继续下看. while(1) {  st
  • 静态成员变量一定要初始化吗?

    千次阅读 2019-09-15 12:53:41
    我们知道C++类的静态成员变量是需要初始化的,但为什么初始化呢。 其实这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。 两者的区别在于:初始...
  • C++类的静态成员变量一定要初始化(分配内存)

    万次阅读 多人点赞 2018-07-11 09:06:29
    我们知道C++类的静态成员变量是需要初始化的,但为什么初始化呢。其实这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。两者的区别在于:初始化是...
  • C++静态成员变量初始化

    千次阅读 2018-06-19 07:52:28
    class example{ public: //static double rate=6.5; static const int size; std::vector<double> vec(size); }; 代码是这样的。...于是编译的时候总是出错!...size这个变量不是co...
  • 静态变量初始化

    千次阅读 2015-07-21 10:20:40
    静态数据成员的使用方法和注意事项如下:  1、静态数据成员在定义或... (1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。  (2) 初始化时不加该成员的访问权限控制符private,
  • springboot 初始化静态变量

    千次阅读 2020-03-27 16:18:43
    @Component @Slf4j public class TestUtil { private static String VARENV; @Value("${spring.test.env}") public void setApacheVarenv(String varenv) { TestUtil.VARENV = varenv; ......

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 572,638
精华内容 229,055
关键字:

静态变量什么时候初始化