2016 - 2024

感恩一路有你

java静态变量一定要初始化吗 的静态成员变量为什么一定要初始化?

浏览量:2376 时间:2021-03-15 15:12:13 作者:admin

的静态成员变量为什么一定要初始化?

我们知道C类的静态成员变量需要初始化,但是为什么要初始化呢。实际上,“静态成员变量需要初始化”这句话有一些问题。应该说“静态成员变量需要定义”是准确的,而不是初始化。两者的区别在于初始化是分配一个初始值,而定义是分配内存。静态成员变量只在类中声明,而没有定义,因此在类外定义它们实际上是为静态成员变量分配内存。

为什么类的静态成员变量要在文件域中初始化?

1. 在类中,只声明静态变量,没有定义。

2. 声明只表示变量的数据类型和属性,不分配内存;定义需要分配内存。注意:如果inta是在这样的类中编写的,那么它是声明变量和定义变量的组合。

3. 静态成员是“类级”,即与类具有相同的状态,而普通成员是“对象(实例)级”。类级成员存在于类的任何对象之前,并且由类的所有对象共享。

4. 现在,假设我们要实例化这个类的一个对象,会发生什么?静态成员必须出现在这个对象中,对吗?是时候定义静态成员了吗?这显然不合适。因为,例如,如果另一个线程想要创建这个类的对象,静态成员也应该这样定义。这将导致两种可能的情况:1。重复定义;2。即使没有重复的定义,也会出现竞争,导致死锁,从而无法创建对象。显然,编译器无法做到这一点。因此,一个合理的解决方案是提前在类外定义它,然后与所有对象共享它。注意:类的静态常量成员可以在类内初始化。

如何初始化一个类中的静态成员变量?

如果我们不考虑父类,我们可以先进行静态初始化,然后进行非静态初始化。

静态初始化包括静态成员变量和静态块的初始化。实际上,静态块在编译期间是集中的。

非静态初始化包括非静态成员变量初始化、非静态块和构造方法,编译后集中在构造方法中。

如果没有相互通话,那就非常简单了。首先,静态初始化。如果在静态初始化过程中调用了后者呢?!你可以编写一个代码来测试它:

输出:

你可以先看到它确实是静态初始化,但是中间有对构造方法的调用。

虽然编译器不报告错误,但此调用实际上是有风险的。

由于静态成员变量(如果已设置)在初始化之前调用类构造函数(假设存在依赖关系),因此该过程实际上是不可控制的。

看看这个例子:你能想象这种输出吗?

因此,如果必须在静态初始化过程中调用此类的构造函数。

一定要注意初始化顺序,准确到语句。

java静态变量一定要初始化吗 静态变量赋值后可以修改吗 成员变量可以不初始化吗

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。