前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【编程基础】Java初始化有何玄机?

【编程基础】Java初始化有何玄机?

作者头像
程序员互动联盟
发布2018-03-14 17:11:13
5730
发布2018-03-14 17:11:13
举报
文章被收录于专栏:程序员互动联盟
对于Java的初始化顺序大家应该清楚,之前在网站上面有专门的讲解,大家可以通过文章下面的“查看原文”来阅读。

初始化顺序总结起来就是:

1、无继承情况的初始化顺序:

  • 静态块和静态数据按定义的先后顺序进行初始化。
  • 普通成员初始化。
  • 构造函数。

2、有继承情况的初始化顺序:

  • 父类的静态块和静态数据按定义的先后顺序进行初始化。
  • 子类的静态块和静态数据按定义的先后顺序进行初始化。
  • 父类的普通成员初始化。
  • 父类的构造函数。
  • 子类的普通成员初始化。
  • 子类的构造函数。

下面给大家看一道面试题来巩固一下:

父类A.java:

public class A { String tag = "A"; public A() { System.out.println("A is constructed tag = " + tag); printTag(); } void printTag() { System.out.println("A printTag " + tag); } }

子类B.java:

public class B extends A { String tag = "B"; public B() { System.out.println("B is constructed tag = " + tag); printTag(); } void printTag() { System.out.println("B printTag " + tag); } public static void main(String[] arg) { A a = new B(); } }

运行结果是什么呢?大家可以动手试试,根据上面总结的初始化顺序下自己手写一份答案,然后再上机试一下正确与否。答案是:

A is constructed tag = A B printTag null B is constructed tag = B B printTag B

你是否做对了呢?

对于这道题给大家的警示就是千万别在初始化函数中调用重写的方法,因为在初始化子类实例的时候必先调用父类初始化函数,如果初始化函数中有子类重写的方法就会走到子类的重载方法中,而此时子类还没有完成初始化,所以变量都是未赋值的,所以会出现上面的输出结果。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档