2 u014611521 u014611521 于 2016.03.27 02:32 提问

java中static相关问题

class Bowl {
static{
System.out.println("这是Bow3的测试!");
}
{
System.out.println("这是Bow1的测试!");
}
static{
System.out.println("这是Bow4的测试!");
}
}

以上类new后输出:
这是Bow3的测试!
这是Bow4的测试!
这是Bow1的测试!
应该是在类编译的时候就已经加载了,那么static{}和{}区别是什么?

3个回答

caozhy
caozhy   Ds   Rxr 2016.03.27 06:36
已采纳
u014611521
u014611521 多谢
一年多之前 回复
Crabime
Crabime   2016.03.27 09:58

普通初始化块负责对象初始化,类初始化负责对类进行初始化。静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建
对象时才执行。而你说在编译时就加载了静态初始化块我认为就不太正确了,准确说是:当JVM第一次主动使用某个类时,系统会在类准备阶段为该类的所有
的静态成员变量分配内存;在初始化阶段则初始化这些静态常量。那么你new之前不就是在使用这个Bowl类,那么JVM不就应该加载该类的所有类变量,
在new之前定义一个Bowl对象时这个阶段就应该初始化该类的所有成员变量,最后调用该类的构造方法。

u014611521
u014611521 多谢指点
一年多之前 回复
ly881010
ly881010   2016.03.27 16:56

{} 是 普通初始化块, 属于对象
static 是 静态初始化块, 属于类, 类在加载连接后悔进行初始化, 这时候会执行 静态初始化
对象new之前 先进行类的初始化,因为类是对象的模板,先有类,后有对象, 类的初始化 悔执行静态代码块,
初始完后,根据模板 创建对象, 创建对象过程中 悔执行 普通代码块。

同级别的代码块是 自上而下依次执行的

希望对你有帮助

u014611521
u014611521 谢谢
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!