欢迎来到天天文库
浏览记录
ID:51002195
大小:37.00 KB
页数:7页
时间:2020-03-08
《初始器的执行顺序讲解.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、初始器可以用来初始化对象和类中的变量,为这些变量赋初始值。初始器主要有下面几种。■表达式型字段初始器■代码块型静态初始器■代码块型实例初始器例题,运行下面的代码会得到什么结果?publicclassInitializationOrder{staticinti=5;staticintl;intj=7;intk;publicInitializationOrder(intm){System.out.println(i+","+j+","+k+","+l+","+m);}{j=70;l=20;}static{i=50;}publics
2、taticvoidmain(String[]args){newInitializationOrder(l);}}运行结果:代码可以正确编译,运行时打印出50,70,0,20,01、表达式型变量初始器变量声明语句中利用表达式型初始器可以明确规定变量的初始化。实例代码如下:publicclassMyClass{inti=20;//(1)非静态初始化staticdoublej=20.05;//(2)静态初始化publicstaticvoidmain(String[]args){//...}}利用new运算符创建对象的时候,该对象的变
3、量就会被初始化为表达式中所定义的初始值,如上面的代码(1)处。类的初始化使得类的静态变量被赋予初始化值,例如上面的(2)处,这意味着,在初始化类的时候,静态变量j就会初始化。说明:静态变量的表达式型初始器不执行通过名字来引用非静态成员,关键词this和super也不能出现在表达式型静态初始器中。由于实例化之前总会进行类的初始化,表达式型实例初始器总可以引用类的任何静态成员,而不用考虑成员的声明次序。下面的示例代码是正确的。publicclassMyClass{inti=20*j;//(1)非静态初始化staticintj=20
4、;//(2)静态初始化publicstaticvoidmain(String[]args){//...}}注意:在Java语言中,变量的声明必须位于任何表达式型初始器运用该变量之前。参考下面的代码:publicclassMyClass{intlength=10;//(1)//doubleare=hi*length*width;//(2)编译错误,因为width应该声明在前doubleare=hi*length*this.width;//(3)编译正常,因为使用了this关键词,但是width值不是10,而是默认的初始值intw
5、idth=10;//intsq=height=20;//(5)合法的表达式(在对height赋值左侧作出前向引用)intheight;//(6)staticinthi=100;publicstaticvoidmain(String[]args){MyClassmy=newMyClass();//...}}上面代码中,(2)是不能通过编译的,因为该表达式型初始器中的变量width没有遵守Java的“读取之前先声明”的原则。变量hi是正确的,值是100,因为hi是类的静态变量,在类实例化之前就已经初始化了。(3)处事编译正常的,同
6、(2)处的区别就是增加了this关键词。值得注意的是,虽然(3)处可以正常编译,但是此时width的值并不是10,而是默认的初始值。(5)处的表达式是合法的,该表达式型初始器会计算为(sq=(height=20)),每个MyClass类初始化的时候height都会设置为20.1、代码块型静态初始器Java语言中可以在类中定义代码块的静态初始器。代码块静态初始器中的代码只会在初始化类的时候初始化一次。注意:代码块型静态初始器不属于任何方法。类可以有多个代码块型初始器,代码块型静态初始器并不是类的成员。关键词this和super不
7、能出现在代码块型静态初始器中。示例代码如下:publicclassMyClass{static{//(1)静态初始器sf1=10;//(2)//sf1=if1;//(3)if1没有声明//inta=2*sf1;//(4)sf1还没有声明intb=sf1=20;//(5)可以在赋值左侧作出前向引用intc=MyClass.sf1;//(6)}staticintsf1=sf2=30;//(7)staticintsf2;//(8)intif1=5;//(9)static{//(10)静态初始器intd=2*sf1;//(11)int
8、e=sf1=50;//(12)}publicstaticvoidmain(String[]args){System.out.println(MyClass.sf1);System.out.println(MyClass.sf2);}}上面的代码中,(1)和(10)处就是代码块
此文档下载收益归作者所有