Java问题解读系列之基础相关---含继承时的执行顺序
今天来研究一下含继承、静态成员、非静态成员时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、如果子类和父类都有静态成员,则优先执行父类中的静态成员;
Java问题解读系列之基础相关---含继承时的执行顺序的更多相关文章
- Java问题解读系列之基础相关---抽象类和接口
今天来说一波自己对Java中抽象类和接口的理解,含参考内容: 一.抽象类 1.定义: public abstract class 类名{} Java语言中所有的对象都是用类来进行描述,但是并不是所有的 ...
- Java问题解读系列之String相关---String类为什么是final的?
今天看到一篇名为<Java开发岗位面试题归类汇总>的博客,戳进去看了一下题目,觉得有必要夯实一下基本功了,所以打算边学边以博客的形式归纳总结,每天一道题, 并将该计划称为java问题解读系 ...
- Java问题解读系列之IO相关---Java深拷贝和浅拷贝
前几天和棒棒童鞋讨论Java(TA学的是C++)的时候,他提到一个浅拷贝和深拷贝的问题,当时的我一脸懵圈,感觉自己学Java居然不知道这个知识点,于是今天研究了一番Java中的浅拷贝和深拷贝,下面来做 ...
- Java问题解读系列之String相关---String、StringBuffer、StringBuilder的区别
今天的题目是String.StringBuffer和StringBuilder的区别: 首先还是去官方的API看看对这三种类型的介绍吧,Go...... 一.继承类和实现接口情况 1.String类 ...
- Java问题解读系列之String相关---String类的常用方法?
今天的题目是:String类的常用方法? 首先,我们在eclipse中定义一个字符串,然后使用alt+/就会出现String类的所有方法,如下图所示: 下面我就挑选一些常用的方法进行介绍: 首先定义两 ...
- try,catch,finally含return时的执行顺序及丢失的伪例
最近面试遇到一个之前也看到过但没去看一下的问题.就是有return情况下的try,catch,finally的执行顺序. 今天写了下. 先看顺序问题.总结如下: 一:finally中没有写return ...
- java中子类继承父类程序执行顺序
java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...
- Java 基础:继承中的执行顺序
1.单独的父类测试 Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分, 它们的执行顺序相对来说比较简单,用程序也很容易验证. 比如新建一个 ...
- Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究
Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, ...
随机推荐
- LoadRunner函数的介绍
LoadRunner函数的介绍 LoadRunner函数 一:通用函数 LoadRunner的通用函数以lr为前缀,可以在任何协议中使用.可以如下分类: 信息相关的函数: lr_error_messa ...
- 深入理解Java虚拟机(自动内存管理机制)
文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获, ...
- Joomla - 优化(时区、google字体、压缩图片、压缩自定义代码)
Joomla - 优化(时区.google字体.压缩图片.压缩自定义代码) 一.时区 发布文章是往往会发现发布时间和当前时间对不上,原因是 Joomla 用的是国际标准时间,和中国时区大约相差8小时, ...
- js页面的弹框怎么关闭啊
1.单纯的关闭window.opener.location.reload(); //刷新父窗口中的网页window.close();//关闭当前窗窗口2.提交后关闭 function save(){d ...
- 转:linux中select()函数分析
源地址:http://blog.csdn.net/zi_jin/article/details/4214359 Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱 ...
- DOS批处理脚本
先概述一下批处理是个什么东东.批处理的定义,至今我也没能给出一个合适的----众多高手们也都没给出----反正我不知道----看了我也不一定信服----我是个菜鸟,当然就更不用说了:但我想总结出一个“ ...
- 如何 在 jQuery 中的 $.each 循环中使用 break 和 continue
jQuery中each类似于javascript的for循环 但不同于for循环的是在each里面不能使用break结束循环,也不能使用continue来结束本次循环,想要实现类似的功能就只能用ret ...
- 跟我一起在Win10中用VMware安装Ubuntu
VMware下安装Ubuntu 打开VMware,创建虚拟机: 点击运行虚拟机,报错为 解决办法为 大功告成,我们已经在Win10中用VMware安装Ubuntu了
- mysql查看执行计划重构后的查询
MYSQL优化器会对客服端发送的SQL语句进行优化,优化后的SQL语句再被MYSQL执行.然后我们在优化SQL的时候,怎么获取到MYSQL优化后执行语句呢. EXPLAIN select * from ...
- 错误 2 error C2059: 语法错误:“::”
设置项目属性,在预定义处理器中添加定义NOMINMAX来禁止使用Vsual C++的min/max宏定义. 项目属性 ——> C/C++ ——> 预处理器 ——> 预处理器定义 ...