不存在继承关系各类中、不存在对象引用的对象创建初始化顺序

实例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.访问类变量或者类方法。

 

转载于:https://www.cnblogs.com/lubocsu/p/5097551.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值