分享
 
 
 

逐步深入剖析java类的构造方式

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

概要:本文通过查看一个精心构造的类结构的运行输出和使用Javap工具查看实际生成的java字节码(bytecode)向java程序员展示了一个类在运行时是如何构造生成的。

要害字: java 构造 javap 字节码 bytecode

按照java规范,一个类实例的构造过程是遵循以下顺序的:

1.假如构造方法(constrUCtor,也有翻译为构造器和构造函数的)是有参数的则进行参数绑定。

2.内存分配将非静态成员赋予初始值(原始类型的成员的值为规定值,例如int型为0,float型为0.0f,boolean型为false;对象类型的初始值为null),静态成员是属于类对象而非类实例,所以类实例的生成不进行静态成员的构造或者初始化,后面将讲述静态成员的生成时间。

3.假如构造方法中存在this()调用(可以是其它带参数的this()调用)则执行之,执行完毕后进入第6步继续执行,假如没有this调用则进行下一步。

4.执行显式的super()调用(可以是其它带参数的super()调用)或者隐式的super()调用(缺省构造方法),此步骤又进入一个父类的构造过程并一直上推至Object对象的构造。

5.执行类申明中的成员赋值和初始化块。

6.执行构造方法中的其它语句。

现在来看看精心构造的一个实例:

class Parent

{

int pm1;

int pm2=10;

int pm3=pmethod();

{

System.out.println("Parent's instance initialize block");

}

public static int spm1=10;

static

{

System.out.println("Parent's static initialize block");

}

Parent()

{

System.out.println("Parent's default constructor");

}

static void staticmethod()

{

System.out.println("Parent's staticmethod");

}

int pmethod()

{

System.out.println("Parent's method");

return 3;

}

}

class Child extends Parent

{

int cm1;

int cm2=10;

int cm3=cmethod();

Other co;

public static int scm1=10;

{

System.out.println("Child's instance initialize block");

}

static

{

System.out.println("Child's static initialize block");

}

Child()

{

co=new Other();

System.out.println("Child's default constructor");

}

Child(int m)

{

this();

cm1=m;

System.out.println("Child's self-define constructor");

}

static void staticmethod()

{

System.out.println("Child's staticmethod");

}

int cmethod()

{

System.out.println("Child's method");

return 3;

}

}

class Other

{

int om1;

Other() {

System.out.println("Other's default constructor");

}

}

public class InitializationTest

{

public static void main(String args[])

{

Child c;

System.out.println("program start");

System.out.println(Child.scm1);

c= new Child(10);

System.out.println("program end");

}

}

进入此文件所在的目录,然后

编译此文件:javac InitializationTest.java

运行此程序:java ?classpath . InitializationTest

得到的结果是:

program start

Parent's static initialize block

Child's static initialize block

10

Parent's method

Parent's instance initialize block

Parent's default constructor

Child's method

Child's instance initialize block

Other's default constructor

Child's default constructor

Child's self-define constructor

program end

假如没有看过上面的关于类的构造的说明,很轻易让人误解为类的构造顺序是如下的结果(忽略参数绑定、内存分配和非静态成员的缺省值赋值):

1.完成父类的非静态成员初始化赋值以及执行初始化块(这个的先后顺序取决于源文件中的书写顺序,可以将初始化块置于成员声明前,那么先执行的将是初始化块,将上面的代码稍稍变动一下就可以验证这一点。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有