java 初始代码块

标签: java
197人阅读 评论(0) 收藏 举报
分类:

class text01{  
    public text01(int i){  
        System.out.println("Test01 of constractor : " + i);  
    }  
}  

public class text02 {

   private text01 t1 = new text01(1);  
   private int n = 10;  
     
   public text02(){  
       System.out.println("Test02 of constructor : " + n);  
   }  
   private text01 t2 = new text01(2);  
   public static void main(String[] args) {  
      text02 test = new text02();  
   }  
 
}


  1. 输出的结果为:  
  2. Test01 of constractor : 1  
  3. Test01 of constractor : 2  
  4. Test02 of constructor : 10  

通过输出,可见当生成Test02的实例test时,它并不是首先调用其构造方法而是先是成员变量的初始化,而且成员的初始化的顺序以成员变量的定义顺序有关,先定义的先初始化,初始化后再调用构造方法。其实成员变量的初始化,在类的所有方法调用之前进行,包括构造方法

当类中有Static 修饰的成员呢?测试下面一段代码:

  1. public class Test03 ...{  
  2.     private int i1 = printCommon();  
  3.     private static int i2 = printStatic();  
  4.       
  5.     public Test03()...{  
  6.           
  7.     }  
  8.     public static int printCommon()...{  
  9.         System.out.println("i1 is init!");  
  10.         return 1;  
  11.     }  
  12.     public static int printStatic()...{  
  13.         System.out.println("i2 is init!");  
  14.         return 2;  
  15.     }  
  16.     public static void main(String[] args) ...{  
  17.         Test03 t = new Test03();  
  18.     }  
  19. }  
  20.   
  21. 输出结果为:  
  22. i2 is init!  
  23. i1 is init!  

可见static的成员比普通的成员变量先初始化。


我们都知道,如果一个类的成员变量没有在定义时,系统会给予系统默认的值,有=号的就直接给予右值,系统在给予初值和=号给予值这2中方式,在执行时间上有先后吗?为了测试,我编写了如下代码:

  1. public class Test04 ...{  
  2.     private static Test04 t1 = new Test04();  
  3.     private static int i1;  
  4.     private static int i2 = 2;  
  5.       
  6.     public Test04()...{  
  7.         i1++;  
  8.         i2++;  
  9.     }  
  10.       
  11.     public static void main(String[] args) ...{  
  12.         Test04 t2 = new Test04();  
  13.         System.out.println("t2.i1 = " + t2.i1);  
  14.         System.out.println("t2.i2 = " + t2.i2);  
  15.     }  
  16. }  
  17. 我们先预计一下输出,可能有几种答案:233322  
  18. 执行代码后:  
  19. t2.i1 = 2  
  20. t2.i2 = 3  

为什么是2和3呢?其实代码的执行顺序是这样的:首先执行给t1,i1,i2分别给予初始值null,0,0,再执行
Test04 t1 =new Test04(),这样i1++,i2++被执行,i1,i2都变为1,执行完毕后接着执行int i1; i1,i2的值仍然是1,1,当执行int i2 = 2时i2被赋予了值,即i1 = 1,i2=2;再执行Test04 t2 = new Test04(),i1,i2再执行++,此时i1 =2,i2 =3,输出i1,i2,结果就是:t2.i1 = 2,t2.i2 = 3。 通过上面的代码我们可以认为系统默认值的给予比通过等号的赋予先执行。

 当生成一个子类时,大家到知道会调用父类的构造方法。如果子类和父类中都有Static的成员变量呢,其实我们在深入分析一个类的内部初始化后,对于存在父类的类的初始化其实原理都一样,具体以下面的代码为例:

public class SuperClass {
static{  
        System.out.println("SuperClass of static block");  
    }  
      
    public SuperClass(){  
        System.out.println("SuperClass of constracutor");  
    }  
}  
public class SubClass extends SuperClass{  
   static{  
       System.out.println("SubClass of static block");  
   }        
   public SubClass(){  
       System.out.println("SubClass of constracutor");  
   }  
     
   public static void main(String[] args){
    SuperClass t = new SubClass();  
   }  
}  



// SuperClass of static block
// SubClass of static block
// SuperClass of constracutor
// SubClass of constracutor


可见当父类,和子类有Static时,先初始化Static,再初始化子类的Static,再初始化父类的其他成员变量->父类构造方法->子类其他成员变量->子类的构造方法。
父 类上层还有父类时,总是先执行最顶层父类的Static-->派生类Static-->派生类 Static-->.......-->子类Static-->顶层父类的其他成员变量-->父类构造方法--> 派生类的其他成员变量 --> 派生类构造方法--> ...............-->子类其他成员变量-->子类构造方法

总结:

  (1) 在一个不存在继承的类中:初始化static变量,执行static初始化快-->初始化普通成员变量(如果有赋值语句),执行普通初始化块-->构造方法

  (2)在一个存在继承的类中:初始化父类static成员变量,运行父类static初始化块-->初始化子类static成员变量,运行子类static初始化块-->初始化父类实例成员变量(如果有赋值语句),执行父类普通初始化块-->父类构造方法-->初始化子类实例成员变量(如果有赋值语句)及普通初始化块-->子类构造方法。

注意:其中变量初始化(赋值)和初始化块的执行与相关语句在源码中的放置顺序一致,不过变量声明会最先执行,参考http://www.189works.com/article-52232-1.html
查看评论

java初始代码块

java跟c语言不同的其中一个是它有初始代码块这东西。即是没有函数名,只有两个大括号包起来的代码。 1 class Test{ 2 3 public Test() 4 ...
  • raining_heart
  • raining_heart
  • 2013-01-08 15:58:31
  • 755

Java 中的构造方法与构造代码块的区别

Java 中的构造方法与构造代码块的区别 分类: Java 开发2013-06-20 14:56 296人阅读 评论(0) 收藏 举报 1.  [java...
  • evilcry2012
  • evilcry2012
  • 2015-03-08 10:21:51
  • 336

父类 子类 动态代码块 静态代码块 构造函数 执行顺序

执行顺序:对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器 第一种情形 父类和子类 都有动态代码块和静态快时 ...
  • w5761499123
  • w5761499123
  • 2016-11-18 11:58:22
  • 297

Java初始代码块的执行顺序

简介Java初始代码块主要分为静态代码块和非静态代码块。 静态代码块:是在类首次被JVM加载时执行且执行一次,并且在其中只能对静态变量进行初始化。 非静态代码块:是在生成一个对象时执行且在构造函数...
  • dawn_after_dark
  • dawn_after_dark
  • 2017-07-02 10:38:21
  • 227

JAVA学习笔记(九)- 初始化块与静态代码块

初始化块/* * 初始化块 * 初始化变量方式:声明时、构造函数、代码块 * 使用static关键字修饰的代码块,称为静态代码块 * * 执行顺序:静态代码块>代码块>构造方法 * ...
  • wangzi11322
  • wangzi11322
  • 2015-03-23 10:22:06
  • 3729

java关于代码块 , 动态代码块 , 静态代码块 , 静态方法 , 构造函数的执行顺序

package com.lanou.Test; public class Static_Main { public static void main(String[] args) { ...
  • xc164725
  • xc164725
  • 2017-08-26 10:22:18
  • 658

java入门学习(6)—封装,继承,多态,this,super,初始代码块

1、【封装】:将对象的状态信息隐藏,不允许直接访问,而是通过该类提供的的方法阿里实现内部信息的访问和操作。       使用到的修饰符:private,不用修饰符(default),protected...
  • newly123
  • newly123
  • 2016-01-14 08:50:18
  • 196

静态代码块和动态代码块

一来般来,静态代码块,在整个系统的生命周期中只执行一次,在构造方法之前执行,动态代码块,在系统中每实例化一次,就执行一次,而且在构造方法执行之前执行。 class AB {     s...
  • Tomsheng321
  • Tomsheng321
  • 2014-12-09 13:45:01
  • 1372

Java四种代码块

在java中用{}括起来的称为代码块,代码块可分为以下四种: 1.普通代码块:    类中方法的方法体 2.构造代码块:    构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行。...
  • u012804721
  • u012804721
  • 2016-09-05 13:00:05
  • 1023

Java子父类间静态代码块、构造代码块、构造方法的执行顺序

先看一段测试
  • u012248099
  • u012248099
  • 2014-07-05 12:15:38
  • 2353
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 1416
    排名: 3万+
    最新评论