java学习笔记-类的初始化
2007-11-05 18:00
204 查看
2007.06.12
3、 类的初始化.
对某个类运行Java时,发生的第一件事就是装载程序到外面找到该类,将该
类装载入内存.在装载过程中,会发生两种情况:
(1) 如果该类没有父类.则
a、首先装载static(静态初始化),因为该类的所有对象共享一个static变
量(方法),而不同的对象分配不同的内存,所以先静态初始化.
b、接下来是类的(非静态)初始化语句(变量的初始化),
c、最后到构造函数.
(2) 如果该类有父类,则较为麻烦,顺序如下:
a、父类静态初始化,子类静态初始化;
b、父类非静态初始化, 父类构造函数;
c、子类非静态初始化,子类构造函数.
如果发现父类还有父类,则以此类推.
用下图能比较清晰的了解:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/xian_fish/346095/o_p3..jpg)
示例如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
package ex;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
class Insert
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int i=9;//2.1 非静态初始化
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int j; //2.2 同上
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Insert()//2.3 构造函数
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
prt("i="+i+",j="+j);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
j=39;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
static int x1=prt("static insert x1 initialized");//1.1 静态
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
static int prt(String s)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
System.out.println(s);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return 47;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
public class Beetle extends Insert
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int k=prt("Beetle.k initialized");//3.1 非静态初始化
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Beetle()//3.2
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
prt("k="+k); //3.2.1
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
prt("j="+j); //3.2.2
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
static int x2=prt("static Beetle.x2 intialized");//1.2 静态
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
static int prt(String s)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
System.out.println(s);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return 63;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
public static void main(String[] args)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
prt("Beetle constructer");//1.3
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Beetle x = new Beetle();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
执行结果如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
static insert x1 initialized
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
static Beetle.x2 initialized
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
Beetle constructer
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
i=9,j=0
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
Beetle.k initialized
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
k=63
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
j=39
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
上面这个例子还包括了一个子类一个父类,相对初始化装载的时候稍微有点麻
烦一点,但是总体原则是一样的。根据上面的编号,装载的顺序是:
1.1,1.2,1.3,,2.1,2.2,2.3,3.1,3.2。
当在装载Beetle类的时候,先去找Beetle.class把他装载进来,在
Beetle.class装载到一半的时候,发现他还有个父类 Insect.class,那么需
要把Insect.class也装载进来,并且先对他进行初始化,那么1.1是最先被初始
化的,接下来父类装载完毕之后,子类接着也装载进来,这样,1.2接着被初始化。
new Beetle()的时候,先分配内存,接着父类的非静态初始化,然后父类构造函
数,所以2.*陆续初始化,接着是子类3.*
基本上初始化的顺序是先父类后子类,先静态,后非静态,最后才是构造函数。
3、 类的初始化.
对某个类运行Java时,发生的第一件事就是装载程序到外面找到该类,将该
类装载入内存.在装载过程中,会发生两种情况:
(1) 如果该类没有父类.则
a、首先装载static(静态初始化),因为该类的所有对象共享一个static变
量(方法),而不同的对象分配不同的内存,所以先静态初始化.
b、接下来是类的(非静态)初始化语句(变量的初始化),
c、最后到构造函数.
(2) 如果该类有父类,则较为麻烦,顺序如下:
a、父类静态初始化,子类静态初始化;
b、父类非静态初始化, 父类构造函数;
c、子类非静态初始化,子类构造函数.
如果发现父类还有父类,则以此类推.
用下图能比较清晰的了解:
![](http://p.blog.csdn.net/images/p_blog_csdn_net/xian_fish/346095/o_p3..jpg)
示例如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
package ex;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
class Insert
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int i=9;//2.1 非静态初始化
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int j; //2.2 同上
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Insert()//2.3 构造函数
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
prt("i="+i+",j="+j);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
j=39;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
static int x1=prt("static insert x1 initialized");//1.1 静态
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
static int prt(String s)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
System.out.println(s);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return 47;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
public class Beetle extends Insert
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
int k=prt("Beetle.k initialized");//3.1 非静态初始化
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Beetle()//3.2
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
prt("k="+k); //3.2.1
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
prt("j="+j); //3.2.2
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
static int x2=prt("static Beetle.x2 intialized");//1.2 静态
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
static int prt(String s)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
System.out.println(s);
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
return 63;
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
public static void main(String[] args)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif)
...{
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
prt("Beetle constructer");//1.3
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Beetle x = new Beetle();
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
执行结果如下:
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
static insert x1 initialized
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
static Beetle.x2 initialized
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
Beetle constructer
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
i=9,j=0
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
Beetle.k initialized
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
k=63
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
j=39
![](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
上面这个例子还包括了一个子类一个父类,相对初始化装载的时候稍微有点麻
烦一点,但是总体原则是一样的。根据上面的编号,装载的顺序是:
1.1,1.2,1.3,,2.1,2.2,2.3,3.1,3.2。
当在装载Beetle类的时候,先去找Beetle.class把他装载进来,在
Beetle.class装载到一半的时候,发现他还有个父类 Insect.class,那么需
要把Insect.class也装载进来,并且先对他进行初始化,那么1.1是最先被初始
化的,接下来父类装载完毕之后,子类接着也装载进来,这样,1.2接着被初始化。
new Beetle()的时候,先分配内存,接着父类的非静态初始化,然后父类构造函
数,所以2.*陆续初始化,接着是子类3.*
基本上初始化的顺序是先父类后子类,先静态,后非静态,最后才是构造函数。
相关文章推荐
- Java学习笔记-数组的静态初始化和动态初始化
- java学习笔记——java中对象的创建,初始化,引用的解析
- java学习笔记----初始化顺序
- Java学习笔记——初始化与清理
- java 编程思想的学习笔记 - 第五章 初始化与清理
- java学习笔记3:对象的初始化顺序
- JAVA学习笔记之继承与初始化
- Android(java)学习笔记159:Dalivk虚拟机的初始化过程
- Java学习个人笔记---java数组初始化
- Java学习笔记二十三:Java的继承初始化顺序
- 【thinking in java】学习笔记 三 初始化及权限控制
- java学习笔记4--对象的初始化与回收
- Java学习笔记-初始化与清理
- Java学习笔记二:初始化(一)
- Java学习笔记(成员变量初始化补充)
- Java学习笔记二:初始化(三)
- Java学习笔记(1) 对象初始化顺序
- 对象初始化学习笔记PersonDemo2.java
- java学习笔记struts----action初始化时间和次数