前阵子看到阿里巴巴的一提面试题是关于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. 设备驱动基础学习--platform driver简单实现

    platform是一条虚拟的总线.设备用platform_device表示,驱动用platform_driver进行注册,Linux platform driver机制和传统的device drive ...

  2. 洛谷 P3901 数列找不同(莫队)

    题目链接:https://www.luogu.com.cn/problem/P3901 这道题简单莫队模板题,然后$add$和$del$分别处理$vis[]$从$0-->1$和从$1--> ...

  3. mysql开启远程访问及相关权限控制

    开启mysql远程访问: 授予用户user 密码 passwd 所有权限 所有主机IP可访问 授权语句:Grant <权限> on 表名[(列名)] to 用户 With grant op ...

  4. 粪发涂墙-Redis

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  5. Centos7编译安装kafka-manager-2.0.0.2

    一.kafka-manager简介 项目地址为:https://github.com/yahoo/kafka-manager 为了简化开发者和服务工程师维护Kafka集群的工作,yahoo构建了一个叫 ...

  6. jsTree获取选中节点和选中指定节点

    jstree获取当前选中的checkbox和获取选中节点的所有节点 首先初始化一个带有复选框的 jstree $('#demo_tree').jstree({ "core" : { ...

  7. if的特性

    js中 if(变量),这个变量只要满足: 变量如果不为0,null,undefined,false,都会被处理为true.只要变量有非0的值或是某个对象,数组,字符串,都会认为true

  8. opencv python:图像直方图 histogram

    直接用matplotlib画出直方图 def plot_demo(image): plt.hist(image.ravel(), 256, [0, 256]) # image.ravel()将图像展开 ...

  9. python小白的爬虫之旅

    1.爬www.haha56.net/main/youmo网站的内容 ieimport requests import re response=requests.get("http://www ...

  10. 吴裕雄 python 神经网络——TensorFlow 循环神经网络处理MNIST手写数字数据集

    #加载TF并导入数据集 import tensorflow as tf from tensorflow.contrib import rnn from tensorflow.examples.tuto ...