本人曾写过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面试题:类初始化和实例初始化等
前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; ...
类--初始化块"); 39. } 40. // 构造器 41. public SubClass() { 42. System.out.println("子类--构造器"); 43. } 44. 45. public static void main(String[] args) { 46. new SubClass(); 47. } 48.} 当我们运行这段...
在Java中,类的初始化顺序是面试中的经典问题之一,它涉及到继承、静态成员以及实例成员等多个方面。正确理解类的初始化顺序对于编写正确、高效的代码至关重要。 首先,需要了解Java类初始化的基本规则,即在类的...
Java语言中的类初始化顺序是面试中常见的问题,尤其对于Java程序员和工程师来说,理解这一概念至关重要。本篇文章将深入解析类初始化的顺序以及在继承情况下的表现。 首先,我们需要明确类初始化顺序的基本规则: ...
Java序列化面试题 Java注解面试题 多线程&并发面试题 JVM面试题 Mysql面试题 Redis面试题 Memcached面试题 MongoDB面试题 Spring面试题 Spring Boot面试题 Spring Cloud面试题 RabbitMQ面试题 Dubbo 面试题 MyBatis ...
大数据面试题V3.0完成了。共523道题,679页,46w+字,来源于牛客870+篇面经。 主要分为以下几部分: Hadoop面试题:100道 Zookeeper面试题:21道 Hive面试题:47道 Flume面试题:11道 Kafka面试题:59到 HBase面试题...
介绍:收集Linux操作系统及Shell脚本编程在测试开发中的重要面试题,助力系统管理和自动化任务。 标签:#Linux #Shell #操作系统 #面试题 #脚本编程 #文件管理 #权限 #网络管理 #自动化 #系统监控
Java作为一门广泛使用的编程语言,其面试题涵盖了基础语法、面向对象、集合框架、多线程、网络编程、异常处理、JVM、设计模式、数据库交互、Spring框架等多个方面。以下是对这些知识点的详细解析: 1. **Java基础**...
* 根据面试难度:可以将面试小抄面试题分为简单、中等、困难三类。 * 根据面试领域:可以将面试小抄面试题分为IT面试题、金融面试题、管理面试题等。 三、面试小抄面试题的学习方法 学习面试小抄面试题需要掌握...
介绍:详述MySQL和MongoDB在测试开发中的常见面试题,涵盖数据库设计和优化等关键概念。 标签:#MySQL #MongoDB #数据库 #面试题 #SQL #NoSQL #查询优化 #索引 #数据迁移 #ACID
这个名为"前端面试题库,包含不限于Vue面试题,React面试题,JS面试题,HTTP面试题,工程化面试题,CSS面试题,算法面试题,大厂面试题,高频面试题.zip"的压缩包文件,显然为准备前端面试的求职者提供了全面的学习...
JAVA面试题解惑系列(一)——类的初始化顺序 JAVA 是一门面向对象的编程语言,类的初始化顺序是 JAVA 程序员和 JAVA 工程师面试中一个非常重要的知识点。本文将详细讲解类的初始化顺序,并提供了相关的测试代码,...
面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....
面试题5:找出程序的错误之处 面试题6:判断程序会出现什么问题 第7章 嵌入式编程 面试题1:编码实现某一变量某位清或置 面试题2:用C编写一个死循环程序 面试题3:用变量a给出下面的定义 面试题4:设置地址为0x67a9...
Java作为一门广泛使用的编程语言,其面试题涵盖了众多的知识领域,包括基础语法、面向对象、集合框架、多线程、网络编程、IO流、异常处理、JVM内存模型、设计模式、数据库操作、Spring框架等。以下是对这些知识点的...
世界500强面试题通常包括以下几类: - 行为面试题:考察个人经历和行为,如“请描述一次你在团队中解决冲突的经历”。 - 技能测试题:针对特定职位所需技能,如编程题或数据分析题。 - 智力题:测试逻辑思维和...
rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:...
最新JAVA面试题总结之基础/框架/数据库/JavaWeb/Redis BIO,NIO,AIO,Netty面试题 35道 BTA 常问的 Java基础39道常见面试题及详细答案 Dubbo面试题 47道 ElasticSearch面试题 30道 Git常用命令面试题 60道 Java并发...
最全的j2EE面试题,题量大、经典,是我面试的整理试题 1、java笔试题大集合 2、各个公司面试题 3、J2EE初学者面试题 4、J2EE面试题(打码查错题) 5、java_华为笔试题 6、java常见面试题 7、java程序员面试宝典 8、...