eric-1001c

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  3 随笔 :: 45 文章 :: 12 评论 :: 0 Trackbacks
1)类成员的初始化
class Bowl{
    Bowl(
int marker){
        System.out.println(
"Bowl("+marker+")");
    }

    
void f1(int marker){
        System.out.println(
"f1("+marker+")");
    }

}

//检查static成员位置与被调用的顺序的关系
class Table{
    
static Bowl bowl1 = new Bowl(1);//before constructor
    Table(){
        System.out.println(
"Table()");
        bowl2.f1(
1);
    }

    
void f2(int marker){
        System.out.println(
"f2("+marker+")");
    }

    
static Bowl bowl2 = new Bowl(2);//after constructor
}

//检查static和normal成员位置与被调用的顺序关系
class Cupboard {
    Bowl bowl3 
= new Bowl(3);       // normal field
    static Bowl bowl4 = new Bowl(4); //static field
    Cupboard(){
        System.out.println(
"cupboard()");
        bowl4.f1(
2);
    }

    
void f3(int marker){
        System.out.println(
"f3("+marker+")");
    }

    
static Bowl bowl5 = new Bowl(5); //after constructor
}

//检查static与main函数之间被调用顺序的关系
public class ClassInitialization {
    
public static void main(String[] args) {
        System.out.println(
"Creating new Cupboard() in main");
        
new Cupboard();
        System.out.println(
"Creating new Cupboard()in main");
        
new Cupboard();
        
        table.f2(
1);
        cupboard.f3(
1);
    }

    
static Table table = new Table();
    
static Cupboard cupboard = new Cupboard();
}
//output
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
cupboard()
f1(2)
Creating new Cupboard()in main
Bowl(3)
cupboard()
f1(2)
f2(1)
f3(1)
   
      1. 当首次构建ClassInitialization的对象时(构造器也看成静态方法),或者类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位ClassInitialization.class
      2. 然后载入class文件,有关静态的初始化都会被执行,而且只能在首次加载的时候进行一次。在例子中由于静态成员Cupboard已经加载了bowl4和bowl5,因此在重新new Cupboard的时候只有Bowl3被加载
      3. 静态的初始化顺序是按出现顺序执行的,因此在例子输出结果中Bowl(1)在Bowl(2)之前,Bowl(4)在Bowl(5)之前
      4. 当用new 创建对象的时候,首先将在堆上为对象分配足够的存储空间
      5. 这块存储空间会被清零,即自动地把对象中的所有基本类型数据都设置成了默认值,而引用则被设置成了null。例子中的bowl3会先被设置成null(也就是说非static的成员初始化都是在static之后的,因此Bowl(3)在Bowl(4)和Bowl(5)之后)
      6. 编译器会检查该类是不是extends于基类,如果是则载入基类。到了基类后,加载顺序和1-7一样
      7. 执行所有出现于字段定义处的初始化动作。例中bowl3被赋予指向Bowl3对象的引用
      8. 执行构造器。
posted on 2007-07-11 16:07 Eric-1001c 阅读(164) 评论(0)  编辑  收藏 所属分类: ThinkingInJava

只有注册用户登录后才能发表评论。


网站导航: