前阵子看到阿里巴巴的一提面试题是关于java类的加载顺序

package com.mikey.demo.Test;

class FatherVariable{
static {
System.out.println("FatherVariable Static Constructor Code");
}
{
System.out.println("FatherVariable Constructor Code");
}
public FatherVariable() {
System.out.println("FatherVariable Constructor Method");
}
} class ChildVariable{
static {
System.out.println("ChildVariable Static Constructor Code");
}
{
System.out.println("ChildVariable Constructor Code");
}
public ChildVariable() {
System.out.println("ChildVariable Constructor Method");
}
} class Father{ static FatherVariable fatherVariable = new FatherVariable(); static {
System.out.println("Father Static Constructor Code");
}
{
System.out.println("Father Constructor Code");
}
public Father() {
System.out.println("Father Constructor Method");
}
} class Child extends Father { static ChildVariable childVariable = new ChildVariable(); static {
System.out.println("Child Static Constructor Code");
}
{
System.out.println("Child Constructor Code");
}
public Child() {
System.out.println("Child Constructor Method");
}
} public class Clazz {
public static void main(String[] args) {
new Child();
//父类静态变量
//FatherVariable Static Constructor Code
//FatherVariable Constructor Code
//FatherVariable Constructor Method
//父类静态代码块
//Father Static Constructor Code
//子类静态变量
//ChildVariable Static Constructor Code
//ChildVariable Constructor Code
//ChildVariable Constructor Method
//子类静态代码块
//Child Static Constructor Code
//父类构造代码块
//Father Constructor Code
//父类构造方法
//Father Constructor Method
//子类构造代码块
//Child Constructor Code
//子类构造方法
//Child Constructor Method
}
}

图解分析

实例化顺序

    父类静态变量
       ↓

    父类静态代码块
          ↓
    子类静态变量
          ↓
    子类静态代码块
          ↓
    父类构造代码块
          ↓
    父类构造方法
          ↓
    子类构造代码块
          ↓
    子类构造方法
        //父类静态变量
//FatherVariable Static Constructor Code
//FatherVariable Constructor Code
//FatherVariable Constructor Method
//父类静态代码块
//Father Static Constructor Code
//子类静态变量
//ChildVariable Static Constructor Code
//ChildVariable Constructor Code
//ChildVariable Constructor Method
//子类静态代码块
//Child Static Constructor Code
//父类构造代码块
//Father Constructor Code
//父类构造方法
//Father Constructor Method
//子类构造代码块
//Child Constructor Code
//子类构造方法
//Child Constructor Method

结论:

1.带继承的类:

先按照声明顺序初始化基类静态变量和静态代码块,接着按照声明顺序初始化子类静态变量和静态代码块,

而后按照声明顺序初始化基类普通变量和普通代码块,然后执行基类构造函数,接着按照声明顺序初始化子类普通变量和普通代码块

最后执行子类构造函数。

JVM类的加载顺序的更多相关文章

  1. java中带继承类的加载顺序详解及实战

    一.背景: 在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩 ...

  2. java类的加载顺序

    related URL: http://www.cnblogs.com/guoyuqiangf8/archive/2012/10/31/2748909.html Parent Class: packa ...

  3. (六)《Java编程思想》——初始化及类的加载顺序

    package chapter7; /** * 初始化及类的加载顺序:顺序如下 * 1.基类的static变量 * 2.导出类的static变量 * 3.基类的变量 * 4.基类的构造函数 * 5.导 ...

  4. Java学习笔记之——this关键字、非静态成员属性和静态成员属性的区别、类的加载顺序

    一.this关键字 1.代表当前类的对象 2.通过” . ”调用成员属性和成员方法 3.通过this可以区分成员属性和参数 参数名和属性名相同的情况,默认是参数名 二.非静态成员属性和静态成员属性的区 ...

  5. JVM——类的加载过程

    附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 装载:查 ...

  6. java架构之路-(JVM优化与原理)JVM类的加载机制

    话不多说,先上图. ***.class文件执行大概就是这样来走的.我们都知道我们的java文件经过编译以后会生成对应的class文件.先经过类装载子系统,然后塞进运行时内存模型的元空间,开始执行方法, ...

  7. Jvm类的加载机制

    1.概述 虚拟机加载Class文件(二进制字节流)到内存,并对数据进行校验.转换解析和初始化,最终形成可被虚拟机直接使用的Java类型,这一系列过程就是类的加载机制. 2.类的加载时机 类从被虚拟机加 ...

  8. JVM 类的加载机制

    在对类的实例化之前.JVM 一般会先进行初始化 主要经过如下几个阶段: 1.加载                       类加载的第一阶段,类加载时机有两个: 1.预加载:当虚拟机启动时,会预加载 ...

  9. java类的加载顺序和实例化顺序(Demo程序)

    一.main函数中实例化对象 父类 package com.learn; public class Father { //静态变量 public static int num_1 = 1; //静态代 ...

随机推荐

  1. Spring-Bean的后置处理器

    Spring——Bean 后置处理器 Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理. BeanPostProcessor 接口定义回调方法,你可以实现该方法来提供自己的实例 ...

  2. Java - 闭包

    概述 简单介绍 闭包 1. 聚合关系 概述 常见的 类间关系 场景 类 A 主要类 持有 类B 的实例 有点行为, 需要 类 B 的介入 类 B 有自己的行为 A 会在某些时候调用 B 的行为 代码示 ...

  3. 【10】DP青蛙跳台阶

    一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1 ...

  4. python的scribe client

    在网上找了一个python的scribe client使用方法 依赖的模块: pip install facebook-scribe pip install thrift 代码例子: #!/usr/b ...

  5. 委托与事件--delegate&&event

    委托 访问修饰符 delegate 返回值 委托名(参数); public delegate void NoReturnNoPara(); public void NoReturnNoParaMeth ...

  6. 每天进步一点点------入门视频采集与处理(显示YUV数据)

    做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...

  7. 南京邮电大学网络攻防平台(NCTF)-MD5-Writeup

    南京邮电大学网络攻防平台-MD5-Writeup 题干如下: 分析: 遍历 TASC?O3RJMV?WDJKX?ZM(?替换为其他),找到md5为e9032???da???08????911513?0 ...

  8. C# 篇基础知识9——特性、程序集和反射

    特性(Attribute)是用于为程序元素添加额外信息的一种机制.比如记录文件修改时间或代码作者.提示某方法已经过期.描述如何序列化数据等等.方法.变量.属性.类.接口.结构体以及程序集等都是程序元素 ...

  9. drf基础知识01

    drf框架 """ 接口: 接口规范: drf生命周期: 序列化组件: 三大认证组件: 过滤.筛选.排序.分页组件: 请求.响应.解析.异常模块: jwt: " ...

  10. JupyterLab远程访问配置方法(CentOS7)

    下载 Anaconda3安装包,并执行安装命令: bash Anaconda3-2019.07-Linux-x86_64.sh 确定安装并初始化: Do you wish the installer ...