zoukankan      html  css  js  c++  java
  • java类初始化顺序

    http://www.cnblogs.com/wenruo/articles/5349525.html

    先不考虑父类。

    当创建类对象时,先初始化静态变量和静态块,然后是非静态变量和非静态代码块,然后是构造器。由于静态成员只会被初始化一次,所以如果静态成员已经被初始化过,将不会被再次初始化。

    例如

     1 class A {
     2     A(int maker) {
     3         System.out.println("A(" + maker + ")");
     4     }
     5 }
     6 
     7 class Test {
     8     static A a1 = new A(1);
     9     A a2 = new A(2);
    10     {
    11         System.out.println("非静态的代码块"); 
    12     }
    13     A a3 = new A(3);
    14     static {
    15         System.out.println("静态块");
    16         A a4 = new A(4);
    17     }
    18     static void f() {System.out.println("f()");}
    19     Test() {
    20         System.out.println("Test()");
    21     }
    22     static A a5 = new A(5);
    23 }
    24 
    25 public class Initialize {
    26     public static void main(String[] args) {
    27         new Test();
    28         System.out.println();
    29         new Test();
    30     }
    31 }

    输出为:

    A(1)
    静态块
    A(4)
    A(5)
    A(2)
    非静态的代码块
    A(3)
    Test()
    
    A(2)
    非静态的代码块
    A(3)
    Test()

    对于静态成员,不仅是初始化对象时才会初始化,当第一次引用静态变量或者静态函数时都会使静态成员初始化。

    还是上面的代码,小改一下:

     1 class A {
     2     A(int maker) {
     3         System.out.println("A(" + maker + ")");
     4     }
     5 }
     6 
     7 class Test {
     8     static A a1 = new A(1);
     9     A a2 = new A(2);
    10     {
    11         System.out.println("非静态的代码块"); 
    12     }
    13     A a3 = new A(3);
    14     static {
    15         System.out.println("静态块");
    16         A a4 = new A(4);
    17     }
    18     static void f() {System.out.println("f()");}
    19     Test() {
    20         System.out.println("Test()");
    21     }
    22     static A a5 = new A(5);
    23 }
    24 
    25 public class Initialize {
    26     public static void main(String[] args) {
    27         Test.f();
    28         System.out.println();
    29         new Test();
    30     }
    31 }

    这次将输出:

    A(1)
    静态块
    A(4)
    A(5)
    f()
    
    A(2)
    非静态的代码块
    A(3)
    Test()

    然后考虑下父类。

    当子类的静态域被初始化时候,那一定要先初始化父类的静态域。

    当创建子类对象时,要先初始化静态域(如果之前未初始化),先是父类然后子类。之后初始化父类的非静态域和父类构造器,然后是子类。

    例(新手起名废求破):

     1 class XD {
     2     XD(int maker) {
     3         System.out.println("XD(" + maker +")");
     4     }
     5 }
     6 
     7 class Father {
     8     Father() {
     9         System.out.println("Father()");
    10     }
    11     static XD xd = new XD(1);
    12     XD xd1 = new XD(2);
    13 }
    14 
    15 class Son extends Father {
    16     Son() {
    17         System.out.println("Son()");
    18     }
    19     static XD xd = new XD(3);
    20     XD xd1 = new XD(4);
    21     static void f() { System.out.println("f()"); }
    22 }
    23 
    24 
    25 public class InitializeWithExtends {
    26     public static void main(String[] args) {
    27         new Son();
    28         System.out.println();
    29         new Son();
    30     }
    31 }

    输出

    XD(1)
    XD(3)
    XD(2)
    Father()
    XD(4)
    Son()
    
    XD(2)
    Father()
    XD(4)
    Son()
  • 相关阅读:
    用POP动画模拟真实秒钟摆动效果
    解析苹果的官方例子LazyTableImages实现图片懒加载原理
    支持xcode6的缓动函数Easing以及使用示例
    [转] iOS 动画库 Pop 和 Canvas 各自的优势和劣势是什么?
    NSJSONSerialization能够处理的JSONData
    [翻译] USING GIT IN XCODE [6] 在XCODE中使用GIT[6]
    [翻译] USING GIT IN XCODE [5] 在XCODE中使用GIT[5]
    [翻译] USING GIT IN XCODE [4] 在XCODE中使用GIT[4]
    [翻译] USING GIT IN XCODE [3] 在XCODE中使用GIT[3]
    【转】断点继传
  • 原文地址:https://www.cnblogs.com/wenruo/p/5349525.html
Copyright © 2011-2022 走看看