liuqiang5151
BlogJava
::
首页
::
联系
::
聚合
::
管理
0 Posts :: 23 Stories :: 1 Comments :: 0 Trackbacks
留言簿
(18)
给我留言
查看公开留言
查看私人留言
我参与的团队
文章分类
Ajax(2)
Hibernate(3)
java(10)
Lucene(2)
Spring(3)
数据库(1)
设计模式(2)
文章档案
2008年7月 (3)
2008年5月 (3)
2008年4月 (5)
2007年12月 (1)
2007年11月 (1)
2007年10月 (1)
2007年9月 (9)
搜索
最新评论
1. re: 转:DWR util.js工具包的使用[未登录]
关于useLoadingImage的使用,我都无法写成功,您能否把源代码发到我的邮箱?
wl_polo@163.com
不胜感谢!
--王冰
转:JAVA面试题解惑系列(一)——类的初始化顺序
作者:臧圩人(zangweiren)
网址:http://zangweiren.javaeye.com
大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果。这实际上是在考查我们对于继承情况下类的初始化顺序的了解。
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:
java代码:
public
class
InitialOrderTest
{
//
静态变量
public
static
String staticField
=
"
静态变量
"
;
//
变量
public
String field
=
"
变量
"
;
//
静态初始化块
static
{
System.out.println(staticField);
System.out.println(
"
静态初始化块
"
);
}
//
初始化块
{
System.out.println(field);
System.out.println(
"
初始化块
"
);
}
//
构造器
public
InitialOrderTest()
{
System.out.println(
"
构造器
"
);
}
public
static
void
main(String[] args)
{
new
InitialOrderTest();
}
}
运行以上代码,我们会得到如下的输出结果:
静态变量
静态初始化块
变量
初始化块
构造器
这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:
java代码:
class
Parent
{
//
静态变量
public
static
String p_StaticField
=
"
父类--静态变量
"
;
//
变量
public
String p_Field
=
"
父类--变量
"
;
//
静态初始化块
static
{
System.out.println(p_StaticField);
System.out.println(
"
父类--静态初始化块
"
);
}
//
初始化块
{
System.out.println(p_Field);
System.out.println(
"
父类--初始化块
"
);
}
//
构造器
public
Parent()
{
System.out.println(
"
父类--构造器
"
);
}
}
public
class
SubClass
extends
Parent
{
//
静态变量
public
static
String s_StaticField
=
"
子类--静态变量
"
;
//
变量
public
String s_Field
=
"
子类--变量
"
;
//
静态初始化块
static
{
System.out.println(s_StaticField);
System.out.println(
"
子类--静态初始化块
"
);
}
//
初始化块
{
System.out.println(s_Field);
System.out.println(
"
子类--初始化块
"
);
}
//
构造器
public
SubClass()
{
System.out.println(
"
子类--构造器
"
);
}
//
程序入口
public
static
void
main(String[] args)
{
new
SubClass();
}
}
运行一下上面的代码,结果马上呈现在我们的眼前:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。
那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。
同样,我们还是写一个类来进行测试:
java代码:
public
class
TestOrder
{
//
静态变量
public
static
TestA a
=
new
TestA();
//
静态初始化块
static
{
System.out.println(
"
静态初始化块
"
);
}
//
静态变量
public
static
TestB b
=
new
TestB();
public
static
void
main(String[] args)
{
new
TestOrder();
}
}
class
TestA
{
public
TestA()
{
System.out.println(
"
Test--A
"
);
}
}
class
TestB
{
public
TestB()
{
System.out.println(
"
Test--B
"
);
}
}
运行上面的代码,会得到如下的结果:
Test--A
静态初始化块
Test--B
大家可以随意改变变量a、变量b以及静态初始化块的前后位置,就会发现输出结果随着它们在类中出现的前后顺序而改变,这就说明静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,变量和初始化块也遵循这个规律。
了解了继承情况下类的初始化顺序之后,如何判断最终输出结果就迎刃而解了。
posted on 2008-07-09 18:08
刘强
阅读(99)
评论(0)
编辑
收藏
所属分类:
java
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
转:JAVA面试题解惑系列(三)——变量(属性)的覆盖
转:JAVA面试题解惑系列(二)——到底创建了几个String对象?
转:JAVA面试题解惑系列(一)——类的初始化顺序
转:关于java的hashCode方法
Sax和Dom解析xml的区别
转:利用Dom4J生成xml
转 深入理解abstract class和interface
poi技术
java中常用的一些方法
java中如何计算百分比
Copyright @ 刘强
Powered by:
.Text
and
ASP.NET
Theme by:
.NET Monster