今天来研究一下含继承、静态成员、非静态成员时Java程序的执行顺序:

一、不含继承,含有静态变量、静态代码块

创建一个子类,该类包含静态变量、静态代码块、静态方法、构造方法

/**
* @createtime 2017年3月17日 下午5:17:02
* @description 创建一个子类
*/
public class Son{
public static String name = "子类name"; public static long date = new Date().getTime(); public String time = String.valueOf(System.currentTimeMillis());
/**
* 静态代码块
*/
static{
System.out.println("子类静态代码块");
System.out.println("子类静态代码块日期是:"+String.valueOf(date));
} /**
* 非静态代码块
*/
{
System.out.println("子类非静态代码块");
System.out.println("子类非静态代码块执行时间是:"+time);
} /**
* 静态方法
* @param names
*/
public static void getName(String names){
Son.name = names;
System.out.println(name);
} /**
* 默认构造方法
*/
public Son(){
this("构造son");
System.out.println("子类默认构造方法");
} public Son(String names){
System.out.println("子类含参构造方法");
this.name = names;
} public static void main(String[] args) {
getName("son-name");
new Son();
}
} /*不继承父类时--执行结果如下:
子类静态代码块
子类静态代码块日期是:1489742299514
son-name
子类非静态代码块
子类非静态代码块执行时间是:1489742299514
子类含参构造方法
子类默认构造方法
*/

根据执行结果可以很直观的看出,执行顺序是:

静态代码块->调用的静态方法->非静态代码块->构造方法

这都是有明显输出情况下看到的顺序,还有一些变量的输出也是有顺序的,只是从结果不太容易看出,但是可以通过断点来调试,在调试之前一定要在所有变量、

方法及代码块前打上断点,这样看执行顺序就很明了,我打断点之后发现这个程序的整个执行过程是这样的:

静态变量赋值-->执行静态代码块-->非静态变量赋值-->执行非静态代码块-->调用静态方法-->调用构造方法

二、含继承、且父类也有静态变量、静态代码块和构造函数

1、创建一个子类,该类包含静态变量、静态代码块、构造方法

/**
* @createtime 2017年3月17日 下午4:25:26
* @description 定义一个父类
*/
public class Father { public static String name = "变量father"; public static long date = new Date().getTime(); public String time = String.valueOf(System.currentTimeMillis());
/**
* 静态代码块
*/
static{
System.out.println("父类静态代码块");
System.out.println("父类静态代码块日期是:"+String.valueOf(date));
} /**
* 非静态代码块
*/
{
System.out.println("父类非静态代码块");
System.out.println("父类非静态代码块执行时间是:"+time);
} /**
* 默认构造方法
*/
public Father(){
this("构造father");
System.out.println("父类默认构造方法");
} public Father(String name){
System.out.println("父类含参构造方法");
this.name = name;
} }
/*继承父类时-执行结果如下:
父类静态代码块
父类静态代码块日期是:1489743876335
子类静态代码块
子类静态代码块日期是:1489743876336
son-name
父类非静态代码块
父类非静态代码块执行时间是:1489743876336
父类含参构造方法
父类默认构造方法
子类非静态代码块
子类非静态代码块执行时间是:1489743876336
子类含参构造方法
子类默认构造方法*/

2、让子类Son继承父类Father

/**
* @createtime 2017年3月17日 下午5:17:02
* @description 创建一个子类
*/
public class Son extends Father{
public static String name = "子类name"; public static long date = new Date().getTime(); public String time = String.valueOf(System.currentTimeMillis());
/**
* 静态代码块
*/
static{
System.out.println("子类静态代码块");
System.out.println("子类静态代码块日期是:"+String.valueOf(date));
} /**
* 非静态代码块
*/
{
System.out.println("子类非静态代码块");
System.out.println("子类非静态代码块执行时间是:"+time);
} /**
* 静态方法
* @param names
*/
public static void getName(String names){
Son.name = names;
System.out.println(name);
} /**
* 默认构造方法
*/
public Son(){
this("构造son");
System.out.println("子类默认构造方法");
} public Son(String names){
System.out.println("子类含参构造方法");
this.name = names;
} public static void main(String[] args) {
getName("son-name");
new Son();
}
}

同样打断点调试后发现详细的执行顺序是:

父类静态变量赋值-->执行父类静态代码块 -->子类静态变量赋值 -->执行子类静态代码块--> 调用子类静态方法--> 父类非静态变量赋值-->执行父类非静态代码块

-->执行父类构造方法-->子类非静态变量赋值-->执行子类非静态代码块-->执行子类构造函数

三、结论

根据以上分析,可以得出以下结论:

1、实例化一个子类时,优先实例化父类;

2、静态优先非静态执行;

3、静态变量优先,其次是静态代码块;

4、如果子类和父类都有静态成员,则优先执行父类中的静态成员;

最新文章

  1. 统计和分析系统性能【IO CPU 内存】的工具集合
  2. 投影转换(AE)
  3. CSS3 calc()的使用
  4. [2015hdu多校联赛补题]hdu5348 MZL's endless loop
  5. 六款值得推荐的android(安卓)开源框架
  6. mysql读写分离(PHP类)
  7. [转] Android资源管理框架(Asset Manager)简要介绍和学习计划
  8. 编译redis
  9. Java学习笔记之接口
  10. [wordpress]后台自定义菜单字段和使用wordpress color picker
  11. .Net的PDF转图片
  12. JQuery Easy Ui (Tree树)详解(转)
  13. eclipse里xml提示包名的插件——Rinzo
  14. Docker - 从零开始到操作
  15. 游戏AI之路径规划(3)
  16. DataTable插件通过js导出Excel
  17. python3 第三十三章 - 标准库概览Part II
  18. yii2 getter
  19. git - 移除文件以及取消对文件的跟踪
  20. uiautomator 代码记录 :BT接收测试

热门文章

  1. 使用Cookie实现用户商品历史浏览记录
  2. E. Present for Vitalik the Philatelist 反演+容斥
  3. 莫烦PyTorch学习笔记(三)——激励函数
  4. Cannot find module '@babel/plugin-proposal-class-properties'
  5. http response 过长 导致Connection reset
  6. OpenCASCADE圆与平面求交
  7. Django项目: 2.模板抽取
  8. windows API 第13篇 MoveFileEx
  9. 跟我一起学习webpack使用配置文件(二)
  10. 两队列模拟一个栈,python实现