黑马程序员_基础复习02_初始化
2012-12-12 12:57
267 查看
------- android培训、java培训、期待与您交流!
----------
一、初始化过程
首先由一个例子来理解初始化的过程:
class Bowl{
Bowl(int marker){
System.out.println("Bowl(" + marker + ")");
}
void f1(int marker){
System.out.println("f1(" + marker + ")");
}
}
class Table{
static Bowl bowl1 = new Bowl(1); //首先static初始化,(1)
Table(){
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int marker){
System.out.println("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);//(2)
}
class Cupboard{
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
4000
Cupboard(){
System.out.println("Cupboard()");
bowl4.f1(2);
}
void f3(int marker){
System.out.println("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
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();
}
首先加载StaticInitialization类,执行main()方法,main方法中有static成员,先初始化static的table和cupboard,这将导致它们对应的类也被加载,先加载Table类,类中静态成员先初始化,然后构造函数初始化。结果为Bowl(1)、Bowl(2)、Table()、f1(1)。然后加载Cupboard类,同样先静态对象初始化,然后非静态对象初始化,最后构造函数初始化,结果为Bowl(4)、Bowl(5)、Bowl(3)、Cupboard()、f1(2)。main()函数中静态成员初始化完成后,其他部分按顺序执行,出现相应结果(如上)。
注意:static成员只初始化一次,之后不会再被初始化。而非静态成员会被重复初始化。
二、静态代码块
格式:
Static{
静态代码块中的执行语句
}
特点:随着类的加载而执行,且只执行一次,并优先于主函数,用于给类进行初始化。
三、构造代码块
格式
{
构造代码块中的执行代码
}
给对象进行初始化,且对象以建立就执行,优先于构造方法执行。
1)构造代码块与构造方法的区别:
构造代码块是给所有对象进行统一初始化(用于定义所有对象的共性特征),而构造 方法是对对应的对象进行初始化(因构造方法有重载,初始化方式不同)
四、总结对象的初始化过程:
1、将.class文件加载到内存中
2、执行static代码块
3、在堆内存中开辟足够的存储空间,分配内存地址
4、给对象的属性(基本类型数据或引用)默认初始化,引用默认值为null
5、对属性进行显示初始化
6、构造代码块初始化
7、对对象进行对应的构造方法初始化
8、将内存地址赋给栈内存中的该对象的变量
----------
一、初始化过程
首先由一个例子来理解初始化的过程:
class Bowl{
Bowl(int marker){
System.out.println("Bowl(" + marker + ")");
}
void f1(int marker){
System.out.println("f1(" + marker + ")");
}
}
class Table{
static Bowl bowl1 = new Bowl(1); //首先static初始化,(1)
Table(){
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int marker){
System.out.println("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);//(2)
}
class Cupboard{
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
4000
Cupboard(){
System.out.println("Cupboard()");
bowl4.f1(2);
}
void f3(int marker){
System.out.println("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
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();
}
首先加载StaticInitialization类,执行main()方法,main方法中有static成员,先初始化static的table和cupboard,这将导致它们对应的类也被加载,先加载Table类,类中静态成员先初始化,然后构造函数初始化。结果为Bowl(1)、Bowl(2)、Table()、f1(1)。然后加载Cupboard类,同样先静态对象初始化,然后非静态对象初始化,最后构造函数初始化,结果为Bowl(4)、Bowl(5)、Bowl(3)、Cupboard()、f1(2)。main()函数中静态成员初始化完成后,其他部分按顺序执行,出现相应结果(如上)。
注意:static成员只初始化一次,之后不会再被初始化。而非静态成员会被重复初始化。
二、静态代码块
格式:
Static{
静态代码块中的执行语句
}
特点:随着类的加载而执行,且只执行一次,并优先于主函数,用于给类进行初始化。
三、构造代码块
格式
{
构造代码块中的执行代码
}
给对象进行初始化,且对象以建立就执行,优先于构造方法执行。
1)构造代码块与构造方法的区别:
构造代码块是给所有对象进行统一初始化(用于定义所有对象的共性特征),而构造 方法是对对应的对象进行初始化(因构造方法有重载,初始化方式不同)
四、总结对象的初始化过程:
1、将.class文件加载到内存中
2、执行static代码块
3、在堆内存中开辟足够的存储空间,分配内存地址
4、给对象的属性(基本类型数据或引用)默认初始化,引用默认值为null
5、对属性进行显示初始化
6、构造代码块初始化
7、对对象进行对应的构造方法初始化
8、将内存地址赋给栈内存中的该对象的变量
相关文章推荐
- 黑马程序员 java基础复习三之对象初始化,多态和异常等
- 黑马程序员-c#基础加强版之方法控制流复习-2变量是否初始化的问题
- 黑马程序员—java基础复习—常用对象
- 黑马程序员—java基础复习—多态和内部类
- 黑马程序员 自学02C#编程基础之变量
- 黑马程序员--基础复习2012.8.5
- c++复习基础要点02 虚函数与模板 与static inline是否共存
- 黑马程序员_java基础复习一基础
- Java基础复习笔记 对象状态、引用种类、垃圾回收形式02
- 黑马程序员_02JAVA基础(1)
- 黑马程序员-c#基础加强版之方法控制流复习-3控制台打印密码
- 黑马程序员_java基础复习三流程控制
- 黑马程序员——Java语言基础——02.java语言基础组成(2)语句
- 黑马程序员--基础复习2012.8.14 多线程
- 黑马程序员 JavaSE-02 Java基础语法1:基本概念
- 黑马程序员--java基础复习之多线程及线程间通信
- oc基础复习03-OC的类02参数
- 黑马程序员——Java基础 异常机制 (复习)
- 黑马程序员——java基础 多线程(复习)
- 黑马程序员--java基础复习之泛型