博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 继承关系中:static,构造函数,成员变量的加载顺序
阅读量:6671 次
发布时间:2019-06-25

本文共 2437 字,大约阅读时间需要 8 分钟。

首先看下面的例子:

package simple.demo;/** * @author Administrator * @date 2019/01/03 */public class ClassA {    ClassB classB1 = new ClassB();    static {        System.out.println("ClassA static=========");        ClassB classB2 = new ClassB();    }    public ClassA(){        System.out.println("ClassA 构造函数=========");    }}
package simple.demo;/** * @author Administrator * @date 2019/01/03 */public class ClassB {    static {        System.out.println("ClassB static=========");    }    public ClassB(){        System.out.println("ClassB 构造函数=========");    }}
package simple.demo;/** * @author Administrator * @date 2019/01/03 */public class ClassC extends ClassA{    ClassB classB3 = new ClassB();    static {        System.out.println("ClassC static=========");    }    public ClassC(){        System.out.println("ClassC 构造函数=========");    }}
package simple.demo;/** * @author Administrator * @date 2019/01/03 */public class Test {    public static void main(String[] args){        ClassC classC = new ClassC();    }}

如果没有看结果,你能猜想输出什么 吗?

输出结果为:

ClassA static=========ClassB static=========ClassB 构造函数=========ClassC static=========ClassB 构造函数=========ClassA 构造函数=========ClassB 构造函数=========ClassC 构造函数=========

分析:

 1、执行main方法的  ClassC classC = new ClassC(); 要实例化ClassC必须先加载ClassC,因为ClassC继承于ClassA,所以加载ClassC之前先加载ClassA,所以加载ClassA的时候,就执行ClassA的static块的内容。

      先输出: System.out.println("ClassA static=========");

2、输出完1步的内容后,紧接着执行 ClassB classB2 = new ClassB(); 要实例化ClassB必须要先加载ClassB,所以ClassB的static块里面的内容要执行:System.out.println("ClassB static=========");

3、输出完2步的内容后,就要实例化ClassB了,所以执行ClassB的构造函数:System.out.println("ClassB 构造函数=========");

4、输出完3步的内容后,ClassA已经加载完毕,就应该加载ClassC了,所以输出:System.out.println("ClassC static=========");

5、输出完4步的内容后,ClassC已经加载完毕,就应该实例化ClassC了,要实例化ClassC就必须得先实例化ClassA, 因为子类的构造方法都会调用父类的构造方法。实例化ClassA之前必须先获取ClassA的所有属性,所以执行 ClassB classB1 = new ClassB();

6、 要执行ClassB classB1 = new ClassB(),必须先加载ClassB,因为ClassB已经在第2步的时候加载过,所以static快的内容不会再执行,只会执行ClassB的构造方法,输出:System.out.println("ClassB 构造函数=========");

7、输出完6步的内容后,已经获取了ClassA的所有属性,开始执行ClassA的构造函数了,输出:System.out.println("ClassA 构造函数=========");

8、输出完7步的内容后,ClassA已经实例化完毕,紧接着实例化ClassC,实例化ClassC之前要获取ClassC的所有属性,所要要执行:ClassB classB3 = new ClassB();

9、 要执行ClassB classB3 = new ClassB(),必须先加载ClassB,因为ClassB已经在第2步的时候加载过,所以static快的内容不会再执行,只会执行ClassB的构造方法,输出:System.out.println("ClassB 构造函数=========");

10、最后执行ClassC的构造函数,所以输出:System.out.println("ClassC 构造函数=========");

 

转载地址:http://mmoxo.baihongyu.com/

你可能感兴趣的文章
mysql远程访问的时候遇到了各种问题
查看>>
jQuery源码-美元背后的一点小技巧
查看>>
关于 多进程epoll 与 “惊群”问题
查看>>
Codeforces Round #175 (Div. 2) C. Building Permutation(贪心)
查看>>
使用任务计划程序自动执行任务
查看>>
IDEA在代码上无错误提示,但是编译时出现error:非法字符
查看>>
失业的程序员(八):创业的要素
查看>>
使用Beetle.Express简单构建高吞吐的TCP&UDP应用
查看>>
CTime类小结1
查看>>
类型串php中null和false和0之间的区别
查看>>
类模式用Bridge模式重写了Libvirt框架
查看>>
Word2003和2007如何隐藏去掉回车符
查看>>
MD5鉴定文件是否相同
查看>>
Linux 定时运行脚本、命令
查看>>
Java Web 文件上传Demo <1>
查看>>
phpmyadmi 上传大文件
查看>>
每日英语:A Buying Guide to Air-Pollution Masks
查看>>
每日英语:As World's Kids Get Fatter, Doctors Turn To The Knife
查看>>
梅西百货公司[编辑]
查看>>
最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹
查看>>