黑马程序员技术交流社区

标题: 对象初始化程序执行过程 [打印本页]

作者: ifuzhen    时间: 2014-4-14 23:01
标题: 对象初始化程序执行过程
  1. /*

  2. 不考虑继承时,对象初始化的过程在视频中都有,考虑继承时,java对象的初始化过程,也可以先用代码验证一下:
  3. //验证一个有父类的java对象的初始化顺序
  4. class InitFu{
  5.     public static String staticFuField = "父类静态变量";
  6.     public String field="父类成员变量";
  7.     public int f;
  8.     static{
  9.             System.out.println(staticFuField);
  10.         System.out.println("父类静态初始化块");
  11.     }// 静态初始化块
  12.     {
  13.         System.out.println("父类成员变量默认值:"+f);      
  14.             System.out.println(field);
  15.         System.out.println("父类构造代码块");
  16.     }// 初始化块
  17.     InitFu(){
  18.         System.out.println("Fu类初始化");
  19.     }
  20. }
  21. public class InitStatic extends InitFu
  22. {
  23.         public static String staticField = "子类静态变量";// 静态变量
  24.     public String field = "子类成员变量";// 变量
  25.     public int z;
  26.     static{
  27.             System.out.println(staticField);
  28.         System.out.println("子类静态初始化块1,位置在前");
  29.     }// 静态初始化块
  30.     {
  31.         System.out.println("子类成员变量还是默认值:"+z);
  32.             System.out.println(field);
  33.         System.out.println("子类构造代码块1,位置在前");
  34.     }// 初始化块
  35.     static{
  36.         System.out.println("子类静态初始化块2,位置在后");
  37.     }// 静态初始化块
  38.     public InitStatic() {
  39.             System.out.println("子类构造函数");
  40.     }// 构造函数
  41.     public static void main(String[] args) {
  42.         new InitStatic();
  43.     }  
  44.     {
  45.             //System.out.println(field);
  46.         System.out.println("子类构造代码块2,位置在后");
  47.     }// 初始化块
  48. }
  49. 运行结果是:
  50. 父类静态变量
  51. 父类静态初始化块
  52. 子类静态变量
  53. 子类静态初始化块1,位置在前
  54. 子类静态初始化块2,位置在后
  55. 父类成员变量默认值:0
  56. 父类成员变量
  57. 父类构造代码块
  58. Fu类初始化
  59. 子类成员变量还是默认值:0
  60. 子类成员变量
  61. 子类构造代码块1,位置在前
  62. 子类构造代码块2,位置在后
  63. 子类构造函数
  64. 这样再分析楼主的代码就容易理解了:
  65. */



  66. /*==============================================================
  67. class Base{
  68.         private int i = 2;//1.最先执行的
  69.         
  70.          Base(){ //2. 第2个顺序执行的,虽然Derved类的构造函数中把super()写在第一行,但不是说是执行到Derived()后才执行父类构造函数
  71.                 System.out.println("base:"+this.i);  //打印:base:2,因为Base()方法执行是在父类中,所以这里的i是父类的,不是子类的。
  72.                 this.display(); //这里调用的是子类的display()方法,因为内存中只有一个子类对象,this就是指向子类对象,而且子类复写了display()方法,这是多态特征,调用的是的子类方法。
  73.         }
  74.         public void display(){
  75.                 System.out.println("base display:"+this.i);
  76.         }
  77. }
  78. class Derived extends Base {
  79.          public int i = 22;
  80.          {
  81.                System.out.println(i+"ooooo");
  82.          }
  83.          public Derived(){
  84.                 super(); //
  85.                 System.out.println(i+"ccccc");
  86.                 i = 222;        
  87.          }
  88.          public void display(){ //3. 从上面的顺序2跳转到这里执行
  89.                 System.out.println("derived display:"+i); //因为display()这个函数是在父类构造函数中执行的,Base()还没执行完,子类自己的成员变量i还没有显示初始化,还是默认值
  90.          }
  91. }
  92. class TestI {
  93.         public static void main(String[] args){
  94.                 new Derived();
  95.         }
  96. }
  97. */
复制代码

作者: jsjchenlong    时间: 2014-4-15 00:19
谢谢,分享啊。




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