java中带继承类的加载顺序详解及实战
一、背景:
在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩固!
二、测试步骤:
1.父类代码
package com.hafiz.zhang; public class Fu
{
private int i = print("this is father common variable");
private static int j = print("this is father static variable");
static{
System.out.println("this is father static code block");
}
{
System.out.println("this is father common code block");
}
public Fu(){
System.out.println("this is father constructor");
} static int print(String str){
System.out.println(str);
return 2;
}
}
2.子类代码
package com.hafiz.zhang; public class Zi extends Fu
{
private int l = print("this is son common variable");
private static int m = print("this is son stati variable");
static{
System.out.println("this is son static code block");
}
{
System.out.println("this is son common code block");
}
public Zi(){
System.out.println("this is son constructor");
}
public static void main(String[] args) {
new Zi();
}
}
最后运行结果为:

下面让我们修改一下两个类中静态代码块和静态成员变量的位置并重新运行
3.修改后的父类代码
package com.hafiz.zhang; public class Fu
{
static{
System.out.println("this is father static code block");
}
{
System.out.println("this is father common code block");
}
public Fu(){
System.out.println("this is father constructor");
} static int print(String str){
System.out.println(str);
return 2;
}
private int i = print("this is father common variable");
private static int j = print("this is father static variable");
}
4.修改后的子类代码
package com.hafiz.zhang; public class Zi extends Fu
{
static{
System.out.println("this is son static code block");
}
{
System.out.println("this is son common code block");
}
public Zi(){
System.out.println("this is son constructor");
}
public static void main(String[] args) {
new Zi();
}
private int l = print("this is son common variable");
private static int m = print("this is son stati variable");
}
修改后的运行结果:

三、测试结果
由测试结果可知:程序首先加载类,然后再对类进行初始化。
加载类的顺序为:先加载基类,基类加载完毕后再加载子类。
初始化的顺序为:先初始化基类,基类初始化完毕后再初始化子类。
最后得出类加载顺序为:先按照声明顺序初始化基类静态变量和静态代码块,接着按照声明顺序初始化子类静态变量和静态代码块,而后按照声明顺序初始化基类普通变量和普通代码块,然后执行基类构造函数,接着按照声明顺序初始化子类普通变量和普通代码块,最后执行子类构造函数。
对于本测试中的执行顺序为:先初始化static的变量,在执行main()方法之前就需要进行加载。再执行main方法,如果new一个对象,则先对这个对象类的基本成员变量进行初始化(非方法),包括构造代码块,这两种是按照编写顺序按序执行的,再调用构造函数。 关于继承的初始化机制,首先执行含有main方法的类,观察到Zi类含有基类Fu,即先加载Fu类的static变量,再加载Zi类的static变量。加载完static变量之后,调用main()方法,new Zi()则先初始化基类的基本变量和构造代码块,再调用基类的构造方法。然后再初始化子类Zi的基本变量和构造代码块,再执行子类的构造函数。
java中带继承类的加载顺序详解及实战的更多相关文章
- (转)面试题--JAVA中静态块、静态变量加载顺序详解
public class Test { //1.第一步,准备加载类 public static void main(String[] args) { new Test(); //4.第四步,new一个 ...
- JAVA中静态块、静态变量加载顺序详解
http://blog.csdn.net/mrzhoug/article/details/51581994 一般顺序:静态块(静态变量)——>成员变量——>构造方法——>静态方法
- Spring Boot 配置加载顺序详解
使用 Spring Boot 会涉及到各种各样的配置,如开发.测试.线上就至少 3 套配置信息了.Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发.测试.线上环境使用不同的配置. 在 ...
- servlet与filter的加载顺序详解
项目:3个filter,3个servlet,匹配的url路径/hello. 情况1:servlet没加<load-on-startup></load-on-startup>情 ...
- dubbo配置文件的加载顺序详解(图示)
Dubbo配置文件的加载顺序 在使用apache dubbo.version2.7.3 时,配置文件的加载情况.以provider提供服务者为例. 配置文件 ,以下四个配置文件. 其优先级 app ...
- 面试题--JAVA中静态块、静态变量加载顺序
最后给大家一道面试题练练手,要求写出其结果(笔试) public class StaticTest { public static int k = 0; public static StaticTes ...
- Javascript在浏览器中的加载顺序详解!
现在前端用javascript用的比较多,当然真心的说这个语言是一个非常业余的语言,但是用的人很多,所以也比较火.今天想完成一个javascript外部文件自动加载的设计(类似于java或者php的i ...
- web.xml加载顺序详解
一. 1.启动tomcat启动web项目,首先读取web.xml文件中<context-param>和<listener> 2.容器创建一个ServletContext(ser ...
- Java中使用Scanner类进行键盘的输入详解
我们在使用Java写代码时,经常会遇到从键盘输入字符串等操作,这时候我们需要用到的是我们的Scanner类来实现获取用户从键盘上的输入操作. Scanner类是一个基于正则表达式的文本扫描器,它可以从 ...
随机推荐
- wordpress如何批量关闭旧日志留言功能
于一些wordpress技术博客或者其他wordpress博客来说,一些旧日志的内容可能已经过时了,但是一些读者,还是对一些问题“纠缠不清”或者“喋喋不休”,怎么办,把留言关了就好了: UPDATE ...
- LESS介绍及其与Sass的差异
自从一个月前我偶然发现LESS之后我就开始坚定的使用它了.CSS本身对我来说从来不是问题,但是我很好奇使用变量来沿着一个调色盘为我的网站或模板创建一些东西的想法.拥有一个提供固定数量选项可选的色盘可以 ...
- windows server 2008 R2 SP1 安装exchange 2010
一. 先决条件 若在windows server R2 SP1企业版系统上典型安装exchange server2010 SP3,则需要提前确定一下先决条件 AD域环境,域和林的功能级别必须是wind ...
- CodeForces 615B Longtail Hedgehog
题目: http://codeforces.com/problemset/problem/615/B 题意:题目描述很复杂,但实际上很简单.大意就是连续的几个点组成尾巴,要求尾巴的长度乘以尾巴终点的分 ...
- plsql 建立oracle作业
--.plsql中学习job --学习job --建表 create table test_job(para_date date); commit; insert into test_job valu ...
- [POJ3277]City Horizon
[POJ3277]City Horizon 试题描述 Farmer John has taken his cows on a trip to the city! As the sun sets, th ...
- 剑指Offer 左旋转字符串
题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abc ...
- PHP中面相对象对象的知识点整理
面向对象 万物皆对象,将构成问题的事务分解到各个对象上,建立对象的目的不是为了完成一个工作,而是为了描述某个事务在解决问题中的行为,更符合人的思维习惯,代码重用性高,可扩展性. ___________ ...
- 使用shell脚本自动化对硬盘进行分区
在Linux系统中,可以使用fdisk 对硬盘进行分区,但是要手动执行很多命令,这样使用有很麻烦,现在记一个用fdisk 的脚本自动执行. #make partition dd count= fdis ...
- 编写Delphi控件属性Stored和Default的理解及应用
property ButtonSize: Integer read FButtonSize write SetButtonSize default 0; property Color: TCol ...