黑马程序员技术交流社区

标题: 静态初始化块与非静态初始化块的区别 [打印本页]

作者: 瓶中人    时间: 2013-11-3 11:00
标题: 静态初始化块与非静态初始化块的区别
       非静态初始化主要用于对象的初始化操作,在每次创建对象时都要调用一次,其执行顺序在构造方法之前。
       如果初始化块前有static关键字修饰,那么该初始化块称为静态初始化块。由于非静态成员不能在静态方法中使用,同样也不在静态初始化块中,因此静态初始化块主要用于初始化静态变量和静态方法。静态初始化块只调用一次,是在类被第一次加载到内存时,并非一定要创建对象才执行。
     静态初始化块的执行顺序在非静态初始化块之前。
     示例如下:
public class Test
{
        public static void main(String[] args)
        {
                T a = new T();
                T a2 = new T();
        }
}
class T
{

        {
            System.out.println("==非静态初始化块==");
        }
        static
     {
             System.out.println("==静态初始化块==");
         }
         public T(){
                System.out.println("==无参的构造方法==\n");
         }
}

结果为:==静态初始化块==
            ==非静态初始化块==
            ==无参的构造方法==

           ==非静态初始化块==
            ==无参的构造方法==
通过上述示例可以看出静态初始化块仅在第一次创建对象时执行,第二次就没有执行,而非静态代码块则可以在每次创建对象都执行一次。
还有静态代码块是在类加载器第一次加载该类时调用,不一定非要创建对象才触发,如果使用“类名.静态方法(静态属性)”也会执行静态初始化块的。
       如下例:
public class Test
{
        public static void main(String[] args)
        {
                T.sayHi();
        }
}
class T
{
        static
        {
             System.out.println("==静态初始化块==");
        }
          public static void sayHi()
      {
               System.out.println("HelloWorld!");
      }
}

结果: ==静态安初始化块==
         HelloWorld


作者: 狼王    时间: 2013-11-3 12:06
难道非静态代码块又称构造函数代码块?在老毕的视频称为构造函数代码块




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2