您现在的位置是:首页 > 文章详情

Java类的初始化顺序

日期:2018-06-16点击:306

做Java开发的,起码要知道类的初始化顺序,因为这样你才知道编写的代码运行到了那里。

img_2d9f75e7088238efb0ff94c2b9653e45.png
与文无关

一段代码

public class BaseTest { private String baseName = "baseName"; static { System.out.println("父类静态代码块"); } public BaseTest() { System.out.println("父类构造方法"); callName(); } public void callName(){ System.out.println(baseName); } static class Sub extends BaseTest{ private String baseName = "subName"; public Sub() { System.out.println("子类构造方法"); } static { System.out.println("子类静态代码块"); } @Override public void callName() { System.out.println(baseName); //输出为null super.callName(); //输出baseName,baseStatic } } public static void main(String[] args) { Sub sub = new Sub(); } } 

以上代码运行的结果如下:

父类静态代码块 子类静态代码块 父类构造方法 null baseName 子类构造方法 

为什么在子类中直接调用 System.out.println(baseName),输出为null呢?
在创造派生类的过程中首先创建基类对象,然后才能创建派生类。创建基类即默认调用BaseTest()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null

静态代码块的初始化

public class StaticTest { static { System.out.println("父类的静态代码块"); } public static String str = getStr(); private static String getStr() { System.out.println("父类的静态方法"); return "str1"; } public StaticTest() { System.out.println("父类构造方法"); } static class SubStatic extends StaticTest{ static { System.out.println("子类的静态代码块"); } public static String str1 = getStr1(); private static String getStr1() { System.out.println("子类的静态方法"); return "str1"; } public SubStatic() { System.out.println("子类构造方法"); } } public static void main(String[] args) { new SubStatic(); } } 

运行结果:

父类的静态代码块 父类的静态方法 子类的静态代码块 子类的静态方法 父类构造方法 子类构造方法 

最后

动手操作,查看了下类的初始化过程。

原文链接:https://yq.aliyun.com/articles/666984
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章