问题描述
- java中static相关问题
-
class Bowl {
static{
System.out.println("这是Bow3的测试!");
}
{
System.out.println("这是Bow1的测试!");
}
static{
System.out.println("这是Bow4的测试!");
}
}以上类new后输出:
这是Bow3的测试!
这是Bow4的测试!
这是Bow1的测试!
应该是在类编译的时候就已经加载了,那么static{}和{}区别是什么?
解决方案
http://www.cnblogs.com/sophine/p/3531282.html
解决方案二:
普通初始化块负责对象初始化,类初始化负责对类进行初始化。静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建
对象时才执行。而你说在编译时就加载了静态初始化块我认为就不太正确了,准确说是:当JVM第一次主动使用某个类时,系统会在类准备阶段为该类的所有
的静态成员变量分配内存;在初始化阶段则初始化这些静态常量。那么你new之前不就是在使用这个Bowl类,那么JVM不就应该加载该类的所有类变量,
在new之前定义一个Bowl对象时这个阶段就应该初始化该类的所有成员变量,最后调用该类的构造方法。
解决方案三:
{} 是 普通初始化块, 属于对象
static 是 静态初始化块, 属于类, 类在加载连接后悔进行初始化, 这时候会执行 静态初始化
对象new之前 先进行类的初始化,因为类是对象的模板,先有类,后有对象, 类的初始化 悔执行静态代码块,
初始完后,根据模板 创建对象, 创建对象过程中 悔执行 普通代码块。
同级别的代码块是 自上而下依次执行的
希望对你有帮助
时间: 2025-01-20 17:05:48