u014611521
疯狂的火鸟
2016-03-26 18:32
采纳率: 100%
浏览 1.3k
已采纳

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
    已采纳
    点赞 评论
  • Crabime
    Crabime 2016-03-27 01:58

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

    点赞 评论
  • ly881010
    ly881010 2016-03-27 08:56

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

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

    希望对你有帮助

    点赞 评论

相关推荐