初始器的执行顺序讲解.doc_第1页
初始器的执行顺序讲解.doc_第2页
初始器的执行顺序讲解.doc_第3页
初始器的执行顺序讲解.doc_第4页
初始器的执行顺序讲解.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

初始器可以用来初始化对象和类中的变量,为这些变量赋初始值。初始器主要有下面几种。 表达式型字段初始器 代码块型静态初始器 代码块型实例初始器例题,运行下面的代码会得到什么结果?public class InitializationOrder static int i=5;static int l;int j=7;int k;public InitializationOrder(int m)System.out.println(i+,+j+,+k+,+l+,+m);j=70;l=20;statici=50;public static void main(String args) new InitializationOrder(l);运行结果:代码可以正确编译,运行时打印出50,70,0,20,01、 表达式型变量初始器变量声明语句中利用表达式型初始器可以明确规定变量的初始化。实例代码如下:public class MyClass int i=20;/(1)非静态初始化static double j=20.05;/(2)静态初始化public static void main(String args) /.利用new运算符创建对象的时候,该对象的变量就会被初始化为表达式中所定义的初始值,如上面的代码(1)处。类的初始化使得类的静态变量被赋予初始化值,例如上面的(2)处,这意味着,在初始化类的时候,静态变量j就会初始化。说明:静态变量的表达式型初始器不执行通过名字来引用非静态成员,关键词this和super也不能出现在表达式型静态初始器中。由于实例化之前总会进行类的初始化,表达式型实例初始器总可以引用类的任何静态成员,而不用考虑成员的声明次序。下面的示例代码是正确的。public class MyClass int i=20*j;/(1)非静态初始化static int j=20;/(2)静态初始化public static void main(String args) /.注意:在Java语言中,变量的声明必须位于任何表达式型初始器运用该变量之前。参考下面的代码:public class MyClass int length=10;/ (1)/double are=hi*length*width;/(2)编译错误,因为width应该声明在前double are=hi*length*this.width;/(3)编译正常,因为使用了this关键词,但是width值不是10,而是默认的初始值int width=10;/int sq=height=20;/(5)合法的表达式(在对height赋值左侧作出前向引用)int height;/(6)static int hi=100;public static void main(String args) MyClass my=new MyClass();/.上面代码中,(2)是不能通过编译的,因为该表达式型初始器中的变量width没有遵守Java的“读取之前先声明”的原则。变量hi是正确的,值是100,因为hi是类的静态变量,在类实例化之前就已经初始化了。(3)处事编译正常的,同(2)处的区别就是增加了this关键词。值得注意的是,虽然(3)处可以正常编译,但是此时width的值并不是10,而是默认的初始值。(5)处的表达式是合法的,该表达式型初始器会计算为(sq=(height=20),每个MyClass类初始化的时候height都会设置为20.2、 代码块型静态初始器Java语言中可以在类中定义代码块的静态初始器。代码块静态初始器中的代码只会在初始化类的时候初始化一次。注意:代码块型静态初始器不属于任何方法。类可以有多个代码块型初始器,代码块型静态初始器并不是类的成员。关键词this和super不能出现在代码块型静态初始器中。示例代码如下:public class MyClass static /(1)静态初始器sf1=10; /(2)/sf1=if1;/(3)if1没有声明/int a=2*sf1;/(4)sf1还没有声明int b=sf1=20;/(5)可以在赋值左侧作出前向引用int c=MyClass.sf1;/(6)static int sf1=sf2=30;/(7)static int sf2;/(8)int if1=5;/(9)static/(10)静态初始器int d=2*sf1;/(11)int e=sf1=50;/(12)public static void main(String args) System.out.println(MyClass.sf1);System.out.println(MyClass.sf2);上面的代码中,(1)和(10)处就是代码块型静态初始器。(4)处是错误的,因为企图在声明之前访问该变量。(11)处是在声明之后的访问,所以是正确的。(2)、(5)、(7)处是正确的,因为可以在赋值左侧作出前向引用。该程序运行后输出如下:50303、 代码块型实例初始器代码块型实例初始器提供了在对象创建期间初始化变量的能力,这种代码块所起到的作用和对象创建期间的构造函数是一样。一个代码块型实例初始器的示例如下:public class MyClass /(1)初始器sf1=10;/(2)/sf1=if1;/(3)if1没有声明/int a=2*sf1;/(4)sf1还没有声明int b=sf1=20;/(5)可以在赋值左侧作出前向引用int c=this.sf1;/(6) int sf1=sf2=30;/(7) int sf2;/(8)int if1=5;/(9)/(10)初始器int d=2*sf1;/(11)int e=sf1=50;/(12)public static void main(String args) MyClass my=new MyClass();System.out.println(my.sf1);System.out.println(my.sf2);运行结果:5030注意:代码块型实例初始器中可以使用关键词this和super4、 构造对象的初始状态以一个示例来理解如何构造对象的初始状态public class InheritIniOrder public static void main(String args) BBB bb=new BBB();System.out.println(main方法: i=+bb.i);class AAAint i=20;/表达式型变量初始器/构造器public AAA()System.out.println(类AAA的构造器 i=+i);/初始器+i;System.out.println(类AAA的初始器 i=+i);class BBB extends AAAint i=5;BBB()this(3);System.out.println(类BBB的默认构造器 i=+i);BBB(int i)System.out.println(类BBB的带参数的构造器 i=+i);/初始器i=i+100;System.out.println(类BBB的初始器 i=+i);运行该程序,结果如下:类AAA的初始器 i=21类AAA的构造器 i=21类BBB的初始器 i=105类BBB的带参数的构造器 i=3类BBB的默认构造器 i=105main方法: i=105总结:当有继承关系时候,先执行父类的表达式型类字段的初始化,然后执行父类的代码块型静态初始器的初始化,执行父类的代码块型实例初始器。在执行父类的默认构造函数,然后子类的执行顺序也按照这个顺序执行。再看一个例子:java的初始器执行顺序运行下面的代码,会得到什么结果?public class MyClass1 private static String msg(String msg)System.out.println(msg);return msg;static String m=msg(1);m=msg(2);staticm=msg(3);public static void main(String args)Object obj=new MyClass1();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论