前阵子看到阿里巴巴的一提面试题是关于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 AOP编程(一)-AOP介绍

    1. AOP介绍 l         在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 ...

  2. 一个c程序的执行是从什么开始的?

    一个C语言的执行是从本程序的main函数开始,到main函数结束,但需要注意的是,也是有特殊情况的,若是代码中出现了exit函数,则直接结束程序,对于这一点还是需要了解的. 关于c语言需要了解的是,C ...

  3. Laravel 虚拟开发环境 Homestead 密码

    默认数据库账号密码账号: homestead 密码:secret 默认 ssh 账号密码账号:vagrant 密码:vagrant创建默认 root 用户sudo passwd root

  4. SpringAOP学习之5种通知

    一.Spring的AOP分为以下5种类型通知 ①前置通知(Before):在连接点执行前执行该通知 ②正常返回通知(AfterReturning):在连接点正常执行完后执行该通知,若目标方法执行异常则 ...

  5. JS中的字符串可以直接调用字符串对象的属性和方法

    在JS中,会自动在字符串与字符串对象之间进行转换,因此,任何一个字符串常量都可以看作是一个String对象,其可以直接作为对象使用,只要在字符串变量的后面加 “.” 便可以直接调用String对象的属 ...

  6. HTML-based script和URL-based script使用规则

     选择哪种模式应该根据实际需要来进行,下面是一些常见的参考原则: 1.基于浏览器的应用程序推荐使用HTML-based script 2.不是基于浏览器的应用程序推荐使用URL-based scrip ...

  7. Nginx做代理

    0 查看日志 tail -f /var/log/nginx/access.log 1 Nginx代理配置语法 1.Nginx代理配置语法 Syntax: proxy_pass URL; Default ...

  8. 萌新深度学习与Pytorch入门记录(一):Win10下环境安装

    深度学习从入门到入土,安装软件及配置环境踩了不少坑,过程中参考了多处博主给的解决方法,遂整合一下自己的采坑记录. (若遇到不一样的错误,请参考其他博主答案解决) 笔者电脑系统为win10系统,在此环境 ...

  9. idea项目更改git地址

    第一步:idea打开项目,菜单栏找VCS - Git - Remotes 点进去,弹出对话框,选中,点击编辑 弹出编辑框,更改地址,点击ok 弹出输入账号密码编辑框,输入自己的账号密码,点击确认 完成 ...

  10. 初识HttpRunner

    一.背景 前段时间接触到HttpRunner自动化测试框架,发现对测试人员代码能力要求极低,用户只需准备好用例脚本即可发起测试,非常方便,故记录一下. 二.安装 运行环境 HttpRunner框架基于 ...