前阵子看到阿里巴巴的一提面试题是关于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. Navicat Premium破解

    1.正常下载安装 2.把PatchNavicat.exe文件放到Navicat安装目录下 3.以管理员身份启动PatchNavicat.exe 4.运行Navicat即可

  2. 利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试

    从一到二:利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试 通过从零到一的教程,我们已经得到了通过mnist训练集生成的caffemodel,主要包含下面四个文 ...

  3. URLEncode和URLDecode

    URLEncode.encode(String s,String utf-8) 编码 URLDEcode.decode(String %2b%,String utf-8) 解码 用法: String ...

  4. Springmvc-crud-06(路径忘记加上“/”错误)

    错误: 原因:自己马虎忘记加"  /  ",罚继续写代码┭┮﹏┭┮ 前端代码: <h1>添加功能</h1> <form action="te ...

  5. Springmvc-crud-03(静态资源错误)

    错误描述:静态资源加载失败 原因:spring会拦截静态资源 解决办法: <!-- 配置spring支持静态资源请求 --> <mvc:default-servlet-handler ...

  6. StatelessWidget 无状态组件 StatefulWidget 有状态组件 页面上绑定数据、改变页面数据

    一.Flutter 中自定义有状态组件 在 Flutter 中自定义组件其实就是一个类,这个类需要继承 StatelessWidget/StatefulWidget. StatelessWidget ...

  7. LVS、Tomcat、Nginx、PHP优化项

    一.LVS 性能调优的方法最佳实践1.最小化安装编译系统内核2.优化持久服务超时时间:    1)显示超时时间    #ipvsadm -Ln --timeout    #Timeout (tcp t ...

  8. js 判断素数(质数)

    判断一个数是不是素数 function isPrinme(n) { if(n == 0 || n==1){ return false; } if(n==2){ return true; } for(v ...

  9. 1143. Longest Common Subsequence

    link to problem Description: Given two strings text1 and text2, return the length of their longest c ...

  10. 使用scrapy-redis 搭建分布式爬虫环境

    scrapy-redis 简介 scrapy-redis 是 scrapy 框架基于 redis 数据库的组件,用于 scraoy 项目的分布式开发和部署. 有如下特征: 分布式爬取: 你可以启动多个 ...