本人曾写过JAVA基础方面的blog,也是针对类的初始化的,不过那还只是对thinking in java中示例的调试及部分结论。如下
http://blog.csdn.net/luweifeng1983/archive/2008/01/09/2031662.aspx
不过最近看到一道csdn上的面试题却也没有很好的完成,说明自己在理解类的初始化方面还不够。。下面是贴子,有高人已经给出了很好的结论。。我在这里仅以借鉴做个人总结。。
http://topic.csdn.net/u/20081228/13/9b79175d-30fd-450b-9196-5c73af46b17b.html
试题如下:
packagecom.huogongqiang.bean;
publicclassTestinitial{
publicstaticvoidmain(String[]args){
inta=Test2.a;
System.out.println("finallymain");
}
static{
System.out.println("testinitalinitial");
}
}
classTest1{
staticinta=(int)Math.random()*5;
static{
System.out.println("test1inital");
}
}
classTest2extendsTest1{
staticintb=(int)Math.random()*10;
static{
System.out.println("test2inital");
}
}
输出结果为:
testinital initial
test1 inital
finally main
在这里我的主要疑问是为什么没有输出test2inital,在帖子中得到了很好的回答。。把主要的部结发布如下:
1、类的初始化是指初始化静态成员和静态块;
2、初始化一个类的时候首先初始化该类的父类,如果该类还有父类,那么先初始化父类的父类;
3、对于由引用类变量(class field)所引发的初始化,只会初始化真正定义该field的class。
4、如果一个static field是编译时常量(compile-time constant),则对它的引用不会引起定义它的类的初始化。
该程序首先加载main方法所在的类即Testinitial类,发现该类有static块(这里如果有static成员则也会初始化),所以先输出testinital initial
程序执行到inta=Test2.a;这时候按我原来的想法是先初始化Test1,再初始化Test2的,但按上面的第3条:由引用类型Test2引发的初始化,只初始化真正定义该属性a的类即Test1类。所以输出test1 inital
最后输出finally main
这里针对第4点举例测试:如把Test1类中的staticinta=(int)Math.random()*5;改为static final int a = 5;
publicclassTest{
publicstaticvoidmain(String[]args){
inta=Test2.a;
System.out.println("finallymain");
}
static{
System.out.println("testinitalinitial");
}
}
classTest1{
staticfinalinta=5;
static{
System.out.println("test1inital");
}
}
classTest2extendsTest1{
staticintb=(int)Math.random()*10;
static{
System.out.println("test2inital");
}
}
这样输出结果为:
testinital initial
finally main
注意的是:如果是改成static int a = 5;则Test1还是会初始化的,因为static int a = 5;并不是声明为常量
对于以上注意的第1,2点与我之前blog中测试的是一致的,如下例:
packagecom.gobusiness.eus.util;
publicclassTest{
publicstaticvoidmain(String[]args){
inta=Test2.a;
System.out.println("finallymain");
}
staticTest2t1=newTest2();
static{
System.out.println("testinitalinitial");
}
}
classTest1{
staticinta=(int)Math.random()*5;
static{
System.out.println("test1inital");
}
}
classTest2extendsTest1{
staticintb=(int)Math.random()*10;
static{
System.out.println("test2inital");
}
}
即我加入了staticTest2t1=newTest2(); 那么结果会怎么样呢?
类Test加载后发现staticTest2t1=newTest2();这里因为Test2继承了Test1所以按第2点先初始化Test1类,于是结果为
test1 inital
test2 inital
testinital initial
finally main
对于类的初始化,帖子中有人这样答复:
- 一个类被初始化,归纳起来,大致有:
- 1)它的子类要初始化了,它作为祖先类,被装入并初始化.
- 2)创建它的对象,因而先要进行类的初始化.
- 3)对它的非final型的static成员(数据成员使用或赋值,方法成员调用),被装入并初始化.
- 4)对它的finalstatic型常量(且编译时值已知)的使用,会装入该类但不会被初始化
- 否则:即它的finalstatic型常量(且编译时值未知)的使用,会装入该类且会被初始化
- 5)其它操作(如:反射或Class.forName(...)等等..)
相关推荐
03_JavaSE面试题:类初始化和实例初始化等
java面试题-类的初始化顺序.doc 大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,...
Java面试题集锦6:华为面试题 管理资料.pdfJava面试题集锦6:华为面试题 管理资料.pdfJava面试题集锦6:华为面试题 管理资料.pdfJava面试题集锦6:华为面试题 管理资料.pdfJava面试题集锦6:华为面试题 管理资料.pdf...
c++面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试题面试...
JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题JAVA面试题
JAVA面试题解惑系列(一)——类的初始化顺序-JAVA程序员JAVA工程师面试必看
大数据面试题V3.0完成了。共523道题,679页,46w+字,来源于牛客870+篇面经。 主要分为以下几部分: Hadoop面试题:100道 Zookeeper面试题:21道 Hive面试题:47道 Flume面试题:11道 Kafka面试题:59到 HBase面试题...
Java序列化面试题 Java注解面试题 多线程&并发面试题 JVM面试题 Mysql面试题 Redis面试题 Memcached面试题 MongoDB面试题 Spring面试题 Spring Boot面试题 Spring Cloud面试题 RabbitMQ面试题 Dubbo 面试题 MyBatis ...
Java 最常见 200+ 面试题全解析:面试必备208题
* 根据面试难度:可以将面试小抄面试题分为简单、中等、困难三类。 * 根据面试领域:可以将面试小抄面试题分为IT面试题、金融面试题、管理面试题等。 三、面试小抄面试题的学习方法 学习面试小抄面试题需要掌握...
考试类精品--一道面试题的思考 - 6000万数据包和300万数据包在50M内存使用环境中求交集
JAVA面试题解惑系列类的初始化顺序JAVA程序员JAVA工程师面试必看.pdf
2023java最新阿里巴巴面试题2023java最新阿里巴巴面试题2023java最新阿里巴巴面试题2023java最新阿里巴巴面试题2023java最新阿里巴巴面试题2023java最新阿里巴巴面试题2023java最新阿里巴巴面试题2023java最新阿里...
JAVA面试题解惑系列(一)——类的初始化顺序 JAVA 是一门面向对象的编程语言,类的初始化顺序是 JAVA 程序员和 JAVA 工程师面试中一个非常重要的知识点。本文将详细讲解类的初始化顺序,并提供了相关的测试代码,...
c#笔试面试题 c#笔试面试题 c#笔试面试题 c#笔试面试题 c#笔试面试题
常见算法笔试或面试题 笔试面试专栏:字符串 数组 vc题集 十道海量数据处理面试题与十个方法大总结 google全程面试题 其他一些公司的面试题
面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
目前最全面的SSH面试题集合包含了:SSH框架在内的基本面试题,分类详细,还有JAVASE,JSP的经典面试题在内.
JavaEE企业级开发的面试题汇总,内容包含了: 1.Java基础:JAVASE面试题 2.框架试题:springmvc,spring,mybatis,springdata,springboot,springcolud等企业级开发中常见到的面试题 3.数据库:有关MYSQL数据库的面试题...
最新JAVA面试题总结之基础/框架/数据库/JavaWeb/Redis BIO,NIO,AIO,Netty面试题 35道 BTA 常问的 Java基础39道常见面试题及详细答案 Dubbo面试题 47道 ElasticSearch面试题 30道 Git常用命令面试题 60道 Java并发...