java初始化对象的执行过程

来源:互联网 发布:完整消防队源码 编辑:程序博客网 时间:2024/06/14 20:07

//本文讲一下java初始化对象时代码的执行过程

//为了方便看出类中各个代码执行的顺序,示例代码如下,     

  package cp_04;

            class Bowl {

            Bowl(int marker) {

              System.out.println("Bowl(" + marker + ")");

            }

            void f(int marker) {

                System.out.println("f(" + marker + ")");

            }

            }

            class Table {

            static Bowl b1 = new Bowl(1);

            Table() {

            System.out.println("Table()");

            b2.f(1);

            }

            void f2(int marker) {

               System.out.println("f2(" + marker + ")");

            }

            static Bowl b2 = new Bowl(2);

            }

            class Cupboard {

            Bowl b3 = new Bowl(3);

            static Bowl b4 = new Bowl(4);

            Cupboard() {

               System.out.println("Cupboard()");

               b4.f(2);

                }

            void f3(int marker) {

               System.out.println("f3(" + marker + ")");

            }

                 static Bowl b5 = new Bowl(5);

            }

            public class StaticInitialization {

            StaticInitialization(){

            System.out.println("父类构造=");

            }

            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();

}

//通过输出结果可以看出,当创建一个对象时步骤为::

//static语句 -》普通赋值语句(Bowl b3 = new Bowl(3);)->构造方法

输出结果:

Bowl(1)

Bowl(2)

Table()

f(1)

Bowl(4)

Bowl(5)

Bowl(3)

Cupboard()

f(2)

Creating new Cupboard() in main

Bowl(3)

Cupboard()

f(2)

Creating new Cupboard() in main

Bowl(3)

Cupboard()

f(2)

f2(1)

f3(1)

thinking in java 中将过程总结如下:以新建Dog类为例

在这里有必要总结一下对象的创建过程。请考虑一个名为Dog 的类:

(1) 类型为Dog 的一个对象首次创建时,或者Dog 类的static 方法/static 字段首次访问时,Java 解释器

必须找到Dog.class(在事先设好的类路径里搜索)。

(2) 找到Dog.class 后(它会创建一个Class 对象,这将在后面学到),它的所有static 初始化模块都会运

行。因此,static 初始化仅发生一次——在Class 对象首次载入的时候。

(3) 创建一个new Dog()时,Dog 对象的构建进程首先会在内存堆(Heap)里为一个Dog 对象分配足够多的存

储空间。

(4) 这种存储空间会清为零,将Dog 中的所有基本类型设为它们的默认值(零用于数字,以及boolean 和

char 的等价设定)。

(5) 进行字段定义时发生的所有初始化都会执行。

(6) 执行构建器(构造方法)

那么创建子类会怎样调用父类呢?

写子类:

package cp_04;



public class StaticInitializationChild extends StaticInitialization {

StaticInitializationChild(){

System.out.println("子类构造=");

}

public static void main(String[] args) {

System.out.println("子类执行");

}

static Bowl t4 = new Bowl(6);

}

测试类:

package cp_04;



public class StaticInitializationTest  {

public static void main(String[] args) {

StaticInitializationChild test2=new StaticInitializationChild();

}

}

//static -》赋值语句(Bowl b3 = new Bowl(3);)->构造方法(新建一个对象会调用 其 初始语句,构造方法)

输出如下:

Bowl(1)

Bowl(2)

Table()

f(1)

Bowl(4)

Bowl(5)

Bowl(3)

Cupboard()

f(2)

Bowl(6)

父类构造=

子类构造=

//可以分析出:当创建子类对象时,首先执行父类static 然后是子类static-》父类构造-》子类构造

//附录:部分代码来自thinking in java 第四章 ,本篇文章仅为个人理解,欢迎各位coder指出错误,不吝赐教,谢谢!


1 0