文档章节

关于java类执行的顺序

yeqiang2015
 yeqiang2015
发布于 2018/05/20 16:58
字数 659
阅读 10
收藏 0
之前面试或做题的时候总是会遇到问一个子类继承一个父类后,里面各自有静态代码块,构造器,方法等的执行顺序的问题,总是感觉好像是什么什么样,现在自己来写个例子就知道了:

父类:

public class FatherDemo {
	
	public static int f1 = 3;
	
	private static String name = "father";
	
	public FatherDemo(){
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("========我是Father类==无惨构造器=============");
	}
	
	
	public FatherDemo(String name){
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("========我是Father类==带参构造器=============");
		this.name = name;
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
	}
	
	
	static{
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("========我是Father类==static代码块=============");
		
	}
	
	{
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("========我是Father类==代码块=============");
		
	}
	
	public static void mothod0(){
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("========我是Father类==static方法mothod0=============");
	}
	public void method(){
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("========我是Father类==method方法=============");
	}
	
}

子类:

public class ChildDemo extends FatherDemo{

	public static int f2 = 3;
	
	private static String name = "child";
	
	public ChildDemo(){
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("========我是ChildDemo类==无惨构造器=============");
	}
	
	
	public ChildDemo(String name){
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("========我是ChildDemo类==带参构造器=============");
		this.name = name;
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
	}
	
	
	static{
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("========我是ChildDemo类==static代码块=============");
		
	}
	
	{
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("========我是ChildDemo类==代码块=============");
		
	}
	
     	public static void mothod0(){
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("========我是ChildDemo类==static方法mothod0=============");
	}

	public void method(){
		System.out.println("===f1:"+f1+"=====name:"+name+"========");
		System.out.println("===4444=====我是ChildDemo类==method方法=============");
	}
	
}

测试类:

public static void main(String[] args) {
	ChildDemo child = new ChildDemo();
	child.method();
	System.out.println();
	ChildDemo demo = new ChildDemo("demo");
	demo.method();
}

执行结果: ===f1:3=====name:father======== ========我是Father类==static代码块============= ===f1:3=====name:child======== ========我是ChildDemo类==static代码块============= ===f1:3=====name:father======== ========我是Father类==代码块============= ===f1:3=====name:father======== ========我是Father类==无惨构造器============= ===f1:3=====name:child======== ========我是ChildDemo类==代码块============= ===f1:3=====name:child======== ========我是ChildDemo类==无惨构造器============= ===f1:3=====name:child======== ===4444=====我是ChildDemo类==method方法=============

===f1:3=====name:father======== ========我是Father类==代码块============= ===f1:3=====name:father======== ========我是Father类==无惨构造器============= ===f1:3=====name:child======== ========我是ChildDemo类==代码块============= ===f1:3=====name:demo======== ========我是ChildDemo类==带参构造器============= ===f1:3=====name:demo======== ===f1:3=====name:demo======== ===4444=====我是ChildDemo类==method方法=============

由此可以看出,执行的顺序为:

父类静态属性 --》父类静态代码块--》子类静态属性--》子类静态代码块--》父类代码块--》父类无参构造--》子类代码块--》子类无参构造--》子类方法

如上发现父类和子类的静态方法都没有执行,有意思的是当我实例化子类的带参构造的时候,父类的子类的静态代码块就不执行了,而且执行的顺序变为了: 父类代码块--》父类无参构造器--》子类代码块--》子类带参构造器--》子类method方法

© 著作权归作者所有

yeqiang2015
粉丝 2
博文 21
码字总数 7740
作品 0
丰台
后端工程师
私信 提问
从原理来理解继承关系的类初始化和实例化的顺序

就像之前的一个评论.我们学习的是思路. 很多人都知道继承关系的类的初始化和实例化的顺序,但如果忘记了怎么办? 如何找到自己的答案? 又如果遇到的问题是关于泛型的擦除问题,又该如何去分析?...

xpbug
2013/03/03
0
4
两道面试题,带你解析Java类加载机制

文章首发于【博客园-陈树义】,点击跳转到原文《两道面试题,带你解析Java类加载机制》 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: 请写出最后的输出字符...

陈树义
2018/06/12
0
0
ThreadLocal 源码解析

本文将从以下几个方面介绍 前言 栗子 类图 ThreadLocal源码分析 ThreadLocalMap 源码分析 ThreadLocal 可能会导致内存泄漏 前言 ThreadLocal 顾名思义就是在每个线程内部都会存储只有当前线程...

tsmyk0715
2018/10/28
0
0
两道面试题,带你透彻解析Java类加载机制

  在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题:   class Grandpa { static { System.out.println("爷爷在静态代码块"); } } class Father extends Gran...

java进阶架构师
2018/12/06
0
0
从 Java 到 Scala(四):Traits

本文由 Rhyme 发表在 ScalaCool 团队博客。 特质,一个我们既熟悉又陌生的特性。熟悉是因为你会发现它和你平时在Java中使用的有着很大的相似之处,而陌生又是因为的新玩法会让你打破对原有接...

ScalaCool
2018/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

优雅的关闭Spring Boot

优雅的关闭Spring Boot 1、实现 TomcatConnectorCustomizer 接口拿到Tomcat的连接获取 Tomcat连接池 2、实现 ApplicationListener<ContextClosedEvent> 监听服务器关闭事件,注册JVM钩子函数...

sowhat
今天
2
0
Python3-Web开发

简介 Web开发框架 什么是Web框架? Web应用程序框架或简单的Web框架表示一组库和模块,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。 virtualenv是一个虚拟...

wuxinshui
今天
3
0
使用技媒体实践编写发布博客

技媒体实践博客 CSDN OSChina 知乎 简书 思否 掘金 51CTO

晨猫
今天
2
0
Lucene

1、什么是全文检索 数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据。 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据:指不定长或无固...

榴莲黑芝麻糊
昨天
5
0
python到setuptools、pip工具的安装

python安装 基础开发库   apt-get install gcc  apt-get install openssl libssl-dev 安装数据库和开发库   apt-get install mysql-server libmysqld-dev python环境   下载地址...

问题终结者
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部