Java 关于继承中的static代码块,普通代码块及构造方法的执行顺序
来源:互联网 发布:淘宝充值的钱可以退吗 编辑:程序博客网 时间:2024/06/06 06:30
package cn.edu.bjsxt;class Base { { System.out.println("base block"); } static { System.out.println("base static block"); } Base() { System.out.println("base constructor"); }}class Parent extends Base { int i = 0; int j = 3; { System.out.println("parent block"); } static { System.out.println("parent static block"); } public Parent() { System.out.println("parent constructor"); } void out() { System.out.println(i + "=====" + j); }}class Child extends Parent { int i = 3; int j = 0; { System.out.println("child block"); } static { System.out.println("child static block"); } public Child() { System.out.println("child constructor"); } void out() { System.out.println(i + "####" + j); }}public class Test { public static void main(String[] args) { Parent p = new Child(); p.out(); System.out.println(p.i + "$$$$$" + p.j); }}
程序的运行结果这里不说了,这道题考察两个知识点:代码块(静态、非静态)、继承。
首先讲一下代码块:
代码块定义很简单,就是用{}包裹的一块代码,如果是在大括号外加static 则表示的是静态代码块。这里要提一下类的装载步骤。
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
初始化类中属性是静态代码块的常用用途,但只能使用一次。
所以静态代码块的优先级要高于非静态代码块、构造方法(在一个类中非静态代码块优先级高于构造方法)。
其次讲一下继承:
继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
在上面的程序中,子类(Child)继承了父类(Parent)并且对父类的out()方法进行了重写。
所以当对象p在调用out()的时候,用的是子类(Child)的out()方法。
如果子类(Child)没有对父类的out()方法进行了重写,那么对象p用的将是父类(Parent)的out()方法。
正如上面所说,因为p调用的是子类(Child)的out()方法,所以输出结果中i,j的值是Child类赋值的值。
因为p是父类(Parent)的实例对象,所以p中i,j的值一定是Parent中的i,j的值。
综上所诉:
对象的初始化顺序:首先执行父类静态的内容,然后去执行子类的静态的内容,然后再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,执行完毕后,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。执行完毕后再去执行子类的构造方法。总之一句话,静态代码块内容最先执行,当然父类的静态代码块一定先于子类的静态代码块执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
因表达能力有限,以上说的不清楚的地方望见谅。
- Java 关于继承中的static代码块,普通代码块及构造方法的执行顺序
- Java中static代码块、普通代码块和构造代码块的执行顺序
- java 静态代码块,构造代码块,构造方法,普通代码块的执行顺序
- 静态代码块、代码块、构造方法、普通方法、static方法、 *静态属性、普通属性的加载顺序、执行顺序
- Java子类继承父类,静态代码块、普通代码块、构造代码块的执行顺序
- Java普通代码块,构造代码块,静态代码块区别,执行顺序的代码实例
- java静态代码块/静态属性、构造块、构造方法执行、main方法、普通代码块的顺序
- java静态代码块/静态属性、构造块、构造方法执行、main方法、普通代码块的顺序
- 静态代码块,构造代码块,普通代码块-三者的执行顺序及区别
- Java继承中父类子类构造方法、静态代码块、非静态代码块的执行顺序
- java静态代码块 构造代码块 构造方法的执行顺序及注意问题
- java中代码块的执行顺序--静态代码块,构造器,普通代码块,构造块,main主函数
- 继承中,static代码块,代码块,构造方法执行顺序问题
- static块、普通代码块的执行顺序
- Java初学者Paulmarkyes---中静态代码块,普通代码块,构造代码块,构造方法先后执行顺序以及区别
- 静态代码块,静态属性,静态方法,普通代码块,普通方法,普通属性,构造方法的加载顺序及执行顺序
- java关于代码块 , 动态代码块 , 静态代码块 , 静态方法 , 构造函数的执行顺序
- 在一个类中的static代码块,代码块,构造方法执行顺序
- 多项式加法在单项链表里的表现
- 题目1475:IP数据包解析
- 安卓手机数据备份与恢复方法汇总和操作详解
- 洛谷P3216 [HNOI2011]数学作业
- 关于前面二维码生成类字数限制的修改
- Java 关于继承中的static代码块,普通代码块及构造方法的执行顺序
- JStorm与Storm源码分析(三)--Scheduler,调度器
- python字符串截取操作
- 公司清算案件的诉讼费收取问题
- POJ 3764[The xor-longest Path]题解
- raid 不同级别详解
- Makefile详解(三)
- Hibernate中的代理对象和延迟加载的问题
- QTP11.5破解延长试用