zoukankan      html  css  js  c++  java
  • 不存在继承关系各类中、不存在对象引用的对象创建初始化顺序

    实例3 

       class One 
      { 
           One(String str) 
         { 
           System.out.println(str); 
          } 
       } 
    class Two 
      { 
          One one_1 = new One("one-1"); 
          One one_2 = new One("one-2"); 
          One one_3 = new One("one-3"); 
         Two(String str) 
             { 
               System.out.println(str); 
              } 
        } 
    public class Test 

            public static void main(String[] args) 
             { 
              System.out.println("Test main() start"); 
              Two two = new Two("two"); 
              } 

    输出结果: 
    Test main() start... 
    one-1 
    one-2 
    one-3 
    two 
      在main()方法中实例化了一个Two类的对象。但程序在初始化Two类的对象时,并非先调用Two类的构造方法,而是先初始化Two类的成员变量。这里Two类有3个成员变量,它们都是One类的对象,所以要先调用3次One类的相应的构造方法。最后在初始化Two类的对象。
     即在创建对象时对象所在类的所有数据成员会首先进行初始化,如果其中的成员变量有对象,那么它们也会按照顺序执行初始化工作。在所有类成员初始化完成后,才调用对象所在类的构造方法创建对象。构造方法作用就是初始化。 



      示例4:
     

    class One 


            One(String str) 
         { 
           System.out.println(str); 
          } 

    class Two 
     { 
          One one_1 = new One("one-1"); 
          One one_2 = new One("one-2"); 
          static One one_3 = new One("one-3"); 
       Two(String str) 
            { 
                System.out.println(str); 
            } 

     public class Test 
       { 
           public static void main(String[] args) 
            { 
                System.out.println("Test main() start"); 
                Two two_1 = new Two("two-1"); 
                System.out.println("------------"); 
                 Two two_2 = new Two("two-2"); 
             } 
      } 

    输出结果: 
    Test main() start... 
    one-3 
    one-1 
    one-2 
    two-1 
    ------------ 
    one-1 
    one-2 
    two-2 
      如果一个类中有静态对象,那么它会在非静态对象前初始化,但只初始化一次。非静态对象每次调用时都要初始化

    实例5

         class One 
       { 
                One(String str) 
            { 
             System.out.println(str); 
            } 
       } 
          class Two 
       { 
             One one_1 = new One("one-1"); 
             One one_2 = new One("one-2"); 
             static One one_3 = new One("one-3"); 
          Two(String str) 
             { 
               System.out.println(str); 
             } 

        } 
          public class Test 

           static Two two_3 = new Two("two-3"); 
           public static void main(String[] args) 
          { 
            System.out.println("Test main() start"); 
            Two two_1 = new Two("two-1"); 
            System.out.println("------------"); 
            Two two_2 = new Two("two-2"); 
           } 

    输出结果: 
    one-3 
    one-1 
    one-2 
    two-3 
    Test main() start... 
    one-1 
    one-2 
    two-1 
    ------------ 
    one-1 
    one-2 
    two-2 
      程序中主类中静态变量/静态对象会在main()方法执行前初始化。结果中只输出了一次one-3,这也说明:如果一个类中有静态对象,那么它会在非静态对象前初始化,但只初始化一次。非静态对象每次调用时都要初始化。 

    实例6

    class One 
       { 
              One(String str) 
           { 
              System.out.println(str); 
            } 
       } 
    class Two 
      { 
             static int i = 0; 
             One one_1 = new One("one-1"); 
             static One one_2 = new One("one-2"); 
             static One one_3 = new One("one-3"); 
           Two(String str) 
             { 
           System.out.println(str); 
             } 
      } 
    public class Test 

                public static void main(String[] args) 
                  { 
                     System.out.println("Test main() start"); 
                     System.out.println("Two.i = "  Two.i); 
                   } 

    输出结果: 
    Test main() start... 
    one-2 
    one-3 
    Two.i = 0 
     说明在同一个类的层次结构下:

    不仅第1次创建对象时,类中所有的静态变量要初始化,第1次访问类中的静态变量(没有创建对象)时,该类中所有静态变量也要按照它们在类中排列的顺序初始化

    说明:一般情况下,在主程序中是需要首先创建对象然后才去访问对象的变量或者方法的,在此过程中是需要按照对象初始化的步骤走完所有流程的走完之后才能去访问对象特定变量或者方法
             特殊情况下,在主程序中直接访问类变量或者类方法时,因为类变量和类方法是不依赖对象存在的,所以访问前,主程序中是不需要创建对象的(new)的,那么该程序的运行过程是:1.初始化主程序类的静态变量2.初始化主程序类的静态代码块3.访问类变量或者类方法。

     
  • 相关阅读:
    好的开源项目汇总
    强制SVN上传代码时添加日志
    微信开发-回调模式
    Struct2中自定义的Filter无效
    Ajax 传包含集合的JSON
    PostgreSQL数据库PL/PGSQL学习使用
    单用户对比PG 9.5.4和SYBASE 15.7对超大表的操作性能
    一场一波三折的SQL优化经历
    聚簇索引对数据插入的影响
    磁盘IO初探
  • 原文地址:https://www.cnblogs.com/lubocsu/p/5097551.html
Copyright © 2011-2022 走看看