已经第N次阅读Bruce Eckle大师的《Thinking in java》了,每一次阅读都有不同的收获。闲来无聊,我结合第一章java的upcasting机制和第六章java初始化与类的装载做了一个对象初始化的例子。
Shape类
package org.bjtu.edu;

public class Shape {
  
     private int i=print( "现在初始化Shape的i");
  
     public void draw(){
  
    }
  
     public void erase(){
  
    }
     public Shape(){
  System.out.println( "实例化Shape");
    }
  
     private static int print(String s){  
  System.out.println(s);
   return 47;
    }
}
Circle类
package org.bjtu.edu;

public class Circle extends Shape{
  
     private int i=print( "现在初始化Circle的i");
  
     public void draw(){
  System.out.println( "画一个圆形");
    }
  
     public void erase(){
  System.out.println( "擦除一个圆形");
    }
     public Circle(){
  System.out.println( "实例化Circle");
    }
  
     private static int print(String s){  
  System.out.println(s);
   return 47;
    }
  
}
Square类
package org.bjtu.edu;

public class Square extends Shape{
  
     public void draw(){
  System.out.println( "画一个矩形");
    }
  
     public void erase(){
  System.out.println( "擦除一个矩形");
    }
}
test测试
package org.bjtu.edu;

public class test {
  
     private int i=print( "现在初始化test的i");
     private static int j=print( "现在初始化test的j");    
     /**
  * @param args
  */

     public static void main(String[] args) {
   // TODO Auto-generated method stub
  System.out.println( "现在运行test的main方法");
  Circle cr1;
  Circle cr= new Circle();
   //Square sq=new Square();
  test t= new test();
  t.dostuff(cr);
   //t.dostuff(sq);
    }
  
     public test(){
  System.out.println( "现在实例化一个test");
    }
  
     public void dostuff(Shape s){
  s.draw();
    }
  
     private static int print(String s){  
  System.out.println(s);
   return 47;
    }
  
     public static void init(){
  System.out.println( "现在运行test的static方法");    
    }
  
}
输出结果
现在初始化test的j
现在运行test的main方法
现在初始化Shape的i
实例化Shape
现在初始化Circle的i
实例化Circle
现在初始化test的i
现在实例化一个test
画一个圆形
得出结论,在new一个实例之前(如果仅是一个定义reference则什么都没发生),先初始化类的数据成员,无论是static和非static方法都是不初始化的,随时调用随时分配 如果编译器发现该类有extends方法,则先执行基类方法,基类初始化同理。接着回到实例,如果有main方法则执行main方法,没有则执行构造函数,对象初始化完毕。