免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2225 | 回复: 4
打印 上一主题 下一主题

Java类初始化顺序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-26 16:12 |只看该作者 |倒序浏览
Java技术笔试及面试中常出的问题,我们总结一下

直接看例子:
  1. //test.java
  2. public class test{
  3.         public static void main(String[] args) throws Exception{
  4.                 new ExtendedClass();
  5.         }
  6. }

  7. class BaseClass {
  8.         BaseClass() {
  9.                 print("BaseClass:Constructor");
  10.         }
  11.         AnotherClass ac = new AnotherClass("BaseClass:Variable");
  12.         {print("BaseClass:Initialization Block");}
  13.         static{print("BaseClass:Static Initialization Block");}
  14.         static AnotherClass sac = new AnotherClass("BaseClass:Static Variable");
  15.         public static void print(Object o) {
  16.                 System.out.println(o);
  17.         }
  18. }

  19. class ExtendedClass extends BaseClass {
  20.         ExtendedClass() {
  21.                 print("ExtendedClass:Constructor");
  22.         }
  23.         {print("ExtendedClass:Initialization Block");}
  24.         AnotherClass ac = new AnotherClass("ExtendedClass:Variable");
  25.         static AnotherClass sac = new AnotherClass("ExtendedClass:Static Variable");
  26.         static {print("ExtendedClass:Static Initialization Block");}
  27. }

  28. class AnotherClass {
  29.         AnotherClass(Object o) {
  30.                 System.out.println(o);
  31.         }
  32. }
复制代码
执行结果
  1. BaseClass:Static Initialization Block

  2. BaseClass:Static Variable

  3. ExtendedClass:Static Variable

  4. ExtendedClass:Static InitializationBlock

  5. BaseClass:Variable

  6. BaseClass:Initialization Block

  7. BaseClass:Constructor

  8. ExtendedClass:Initialization Block

  9. ExtendedClass:Variable

  10. ExtendedClass:Constructor
复制代码
可以看出,在创建一个子类对象时,执行顺序是
  1. 父类静态初始化块及静态成员变量

  2. 子类静态初始化块及静态成员变量

  3. 父类非静态初始化块及非静态成员变量

  4. 父类构造函数

  5. 子类非静态初始化块及非静态成员变量

  6. 子类构造函数
复制代码
而关于同为静态(或非静态)的初始化块和成员变量执行的先后顺序是怎样呢,

仔细看例子就可以看出,例子中既有初始化块在成员变量之前,也有成员变量在初始化块之前的情况

运行结果是按源代码书写顺序执行

其实下面的两种书写方式是等价的
  1. class test {
  2.         static type t;
  3.         static {
  4.                 someMethod();
  5.         }
  6. }

  7. //二者等价
  8. class test {
  9.         static {
  10.                 type t;
  11.                 someMethod();
  12.         }
  13. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-10-29 08:30 |只看该作者
很基础的内容,好东西

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
3 [报告]
发表于 2010-11-02 12:11 |只看该作者
实例化的时候都是先执行父类的构造函数啊。

论坛徽章:
0
4 [报告]
发表于 2010-11-02 20:41 |只看该作者
很基础  但又很容易混淆的知识

论坛徽章:
0
5 [报告]
发表于 2010-11-02 20:43 |只看该作者
很基础  但又很容易混淆的知识
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP