• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
小不点儿大的由我做主!
流年似水!
博客园    首页    新随笔    联系   管理    订阅  订阅

java中的初始化

1.初始化顺序
        在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍然会在任何方法(包括构造器)被调用之前得到初始化。下面看个例子就明白了:
class Tag{
    Tag(int marker){
        System.out.println("Tag("+marker+")");
    }
}

class Card
{
    Tag t1 = new Tag(1);
    Card(){
            System.out.println("Card()");
            t3 = new Tag(33);
    }
    Tag t2 = new Tag(2);
    void f(){
        System.out.println("f()");
    }
    Tag t3 = new Tag(3);
}

public class Test
{
    public static void main(String[] args){
        Card t = new Card();
        t.f();
    }
}
执行结果:

Tag(1)
Tag(2)
Tag(3)
Card()
Tag(33)
f()

说明:在main函数中首先创建了一个Card对象,在Card类的定义中有三个变量,分别是t1,t2,t3。虽然它们在类中的定义很分散,但是在对象被创建时,首先要初始化这些对象,所以输出的结果中,先输出Tag(1),Tag(2),Tag(3)。之后才是构造函数,最后才是方法。所以结果很容易理解了。注意此处的t3被初始化了两次。

2.静态数据的初始化
        如果是静态数据,情况是相同的。只是有一点,无论创建多少个对象,静态数据都只占用一份存储区域,也就是说只初始化一次。下面看个例子:
class Bow1
{
    Bow1(int marker){
        System.out.println("Bow1("+marker+")");
    }
    void f(int marker){
        System.out.println("f("+marker+")");
    }
};

class Table
{
    static Bow1 b1 = new Bow1(1);
    Table(){
        System.out.println("Talbe()");
        b2.f(1);
    }
    void f2(int marker){
        System.out.println("f1("+marker+")");
    }
    static Bow1 b2 = new Bow1(2);
};

class Cupboard
{
    Bow1 b3 = new Bow1(3);
    static Bow1 b4 = new Bow1(4);
    Cupboard(){
        System.out.println("Cupboard");
        b4.f(2);
    }
    void f3(int marker){
        System.out.println("f3("+marker+")");
    }
    static Bow1 b5 = new Bow1(5);
};

public class Test1
{
    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();
        t2.f2(1);
        t3.f3(1);
       
    }
    static Table t2 = new Table();
    static Cupboard t3 = new Cupboard();
};

      执行结果有点长,自己执行一下就知道了。还是说明一下吧!

      创建Test1类时,首先要为它的变量分配存储空间。而这两个变量又是静态对象,先为t2分配空间,t2是个Table类,而Table类里又有两个静态变量,所以先为这两个变量分配,所以到此执行的结果为:Bow1(1),Bow1(2),Table(),f(1),然后是为t3对象分配空间。最后执行main函数。因为在为t3分配空间时,b3和b4已经初始化过一次了,所以执行new Cupboard()时,就不用再执行static Bow1 b4 = new Bow1(4); 和static Bow1 b5 = new Bow1(5);了。可以自己执行一下试试。



posted @ 2008-10-15 19:49  小不点儿大的由我做主!  阅读(169)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3