测试代码:  

package com.test.ClassLaoderTest;

public  class test1 {
public static String s_variable = "静态变量";
public String init_variable = "公开的变量";
private String p_variable = "私有的变量";
//静态代码块
static {
System.out.println(s_variable);
System.out.println("静态代码块初始化执行了");
} //初始化代码块
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("初始化代码块执行沦");
} //构造方法
public test1(){
System.out.println("我是构造方法");
} public static void main(String[] args) { } }

  直接运行:

    

  main方法里面不做任何调用的情况下,自动调用的是静态代码块和静态变量

  (2)调用静态变量和静态方法:

    测试代码:    

package com.test.ClassLaoderTest;

public class test1 {
public static String s_variable = "静态变量";
public String init_variable = "公开的变量";
private String p_variable = "私有的变量";
//静态代码块
static {
System.out.println(s_variable);
System.out.println("静态代码块初始化执行了");
} //初始化代码块
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("初始化代码块执行沦");
} //构造方法
public test1(){
System.out.println("我是构造方法");
} //静态方法
public static void test1(){
System.out.println("这是静态方法");
}
public static void main(String[] args) {
System.out.println(test1.s_variable);
test1.test1();
} }

  运行:

  

  结论:当我调用静态方法/静态变量时,只会家在静态代码块,其余的代码块/构造方法不会被加载

    

  (3)创建对象:

    

package com.test.ClassLaoderTest;

public class test1 {
public static String s_variable = "静态变量";
public String init_variable = "公开的变量";
private String p_variable = "私有的变量";
//静态代码块
static {
System.out.println(s_variable);
System.out.println("静态代码块初始化执行了");
} //初始化代码块
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("初始化代码块执行了");
} //构造方法
public test1(){
System.out.println("我是构造方法");
} //静态方法
public static void test1(){
System.out.println("这是静态方法");
}
public static void main(String[] args) {
test1 t1 = new test1();
} }

  运行结果:

    

  输出内容: 

    

静态变量
静态代码块初始化执行了
公开的变量
私有的变量
初始化代码块执行了
我是构造方法

  结论:当创建对象/实例化的时候,调用顺序:静态代码块->初始化代码->构造方法,最后执行的才是构造方法

  

  (4)有继承关系下的类初始化执行流程:

   环境:

    父类:

     

package com.test.ClassLaoderTest;

public class father {
public static String s_variable = "父类静态变量";
public String init_variable = "父类公开的变量";
private String p_variable = "父类私有的变量";
//父类静态代码块
static {
System.out.println(s_variable);
System.out.println("父类静态代码块初始化执行了");
} //父类初始化代码块
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("父类初始化代码块执行了");
} //构造方法
public father(){
System.out.println("我是父类构造方法");
} //父类静态方法
public static void test1(){
System.out.println("这是父类静态方法");
}
}

  

    test1.java:

    继承其父类father:

package com.test.ClassLaoderTest;

public class test1 extends father{
public static String s_variable = "子类静态变量";
public String init_variable = "子类公开的变量";
private String p_variable = "子类私有的变量";
//子类静态代码块
static {
System.out.println(s_variable);
System.out.println("子类静态代码块初始化执行了");
} //子类初始化代码块
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("子类初始化代码块执行了");
} //子类构造方法
public test1(){
System.out.println("我是子类构造方法");
} //子类静态方法
public static void test1(){
System.out.println("这是子类静态方法");
} public static void main(String[] args) { }
}

  

  main方法不做任何操作,运行:

    

 只要extends继承了,优先调用父类静态代码块

(5)有继承关系下的调用静态方法:

    修改子类即可:

package com.test.ClassLaoderTest;

public class test1 extends father{
public static String s_variable = "子类静态变量";
public String init_variable = "子类公开的变量";
private String p_variable = "子类私有的变量";
//子类静态代码块
static {
System.out.println(s_variable);
System.out.println("子类静态代码块初始化执行了");
} //子类初始化代码块
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("子类初始化代码块执行了");
} //子类构造方法
public test1(){
System.out.println("我是子类构造方法");
} //子类静态方法
public static void test1(){
System.out.println("这是子类静态方法");
} public static void main(String[] args) {
test1.test1();
father.test1();
}
}

  运行:

      

  结果:

父类静态变量
父类静态代码块初始化执行了
子类静态变量
子类静态代码块初始化执行了
这是子类静态方法
这是父类静态方法

  main方法中,谁优先调用静态方法,就优先加载谁

 (6)有继承关系下的创建对象:

    代码:

  

package com.test.ClassLaoderTest;

public class test1 extends father{
public static String s_variable = "子类静态变量";
public String init_variable = "子类公开的变量";
private String p_variable = "子类私有的变量";
//子类静态代码块
static {
System.out.println(s_variable);
System.out.println("子类静态代码块初始化执行了");
} //子类初始化代码块
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("子类初始化代码块执行了");
} //子类构造方法
public test1(){
System.out.println("我是子类构造方法");
} //子类静态方法
public static void test1(){
System.out.println("这是子类静态方法");
} public static void main(String[] args) {
test1 t1 =new test1();
}
}

  运行:

   

  结果:

父类静态变量
父类静态代码块初始化执行了
子类静态变量
子类静态代码块初始化执行了
父类公开的变量
父类私有的变量
父类初始化代码块执行了
我是父类构造方法
子类公开的变量
子类私有的变量
子类初始化代码块执行了
我是子类构造方法

  结论:通过结果会发现,不管是子类还是父类静态代码块,静态代码块在哪里都是爸爸级别,最先加载的,当创建test1对象的时候,优先加载的是父类代码块,那么他的初始化执行流程如下:父类静态代码块>子类静态代码块>父类初始化代码块>父类构造方法>子类代码块>子类构造方法

   

   

(7)  有继承关系下的创建父类对象:

   

package com.test.ClassLaoderTest;

public class test1 extends father{
public static String s_variable = "子类静态变量";
public String init_variable = "子类公开的变量";
private String p_variable = "子类私有的变量";
//子类静态代码块
static {
System.out.println(s_variable);
System.out.println("子类静态代码块初始化执行了");
} //子类初始化代码块
{
System.out.println(init_variable);
System.out.println(p_variable);
System.out.println("子类初始化代码块执行了");
} //子类构造方法
public test1(){
System.out.println("我是子类构造方法");
} //子类静态方法
public static void test1(){
System.out.println("这是子类静态方法");
} public static void main(String[] args) {
father father = new father();
}
}

 运行:

  

  结果:

    

父类静态变量
父类静态代码块初始化执行了
子类静态变量
子类静态代码块初始化执行了
父类公开的变量
父类私有的变量
父类初始化代码块执行了
我是父类构造方法

  结论:优先执行的是两个类的静态代码块,然后是父类型的代码块和构造方法,而子类的代码块和构造方法没有被执行是因为没有实例化子类,所以肯定是没有他的,那么只有在创建对象的时候,才会调用代码块和构造方法

Java类初始化执行流程的更多相关文章

  1. Java类初始化

    Java类初始化 成员变量的初始化和构造器 如果类的成员变量在定义时没有进行显示的初始化赋值,Java会给每个成员变量一个默认值 对于  char.short.byte.int.long.float. ...

  2. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...

  3. 【知识总结】Java类初始化顺序说明

    微信公众号:努力编程的小猪如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...

  4. 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程

    003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程 Java程序长啥样? 首先编写一个Java程序 记事本编写程序 打开记事本 1.wi ...

  5. [读书笔记] java类初始化

    以下内容来自周志明的<深入理解java虚拟机>: 类初始化阶段是类加载过程的最后一步,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导 ...

  6. Android(java)学习笔记136:Java类初始化顺序

    Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论:     1 .继承体系的所有静态成员初始化( ...

  7. Java的初始化执行顺序(父类static变量->子类static变量->父类成员变量->父类构造器->成员变量->构造器->main函数)

    1. 引言 了解Java初始化的顺序,有助于理解Java的初始化机制和内存机制. 顺序:父类static变量->子类static变量->父类成员变量->父类构造器->成员变量- ...

  8. [1]朝花夕拾-JAVA类的执行顺序

    最近在温习java的基础,刷题刷到java的执行顺序,很汗颜,答案回答错了! 题目类似如下: package com.phpdragon.study.base; public class ExecOr ...

  9. 转!!关于java类初始化顺序

    原文地址:http://www.cnblogs.com/luckygxf/p/4796955.html 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方 ...

随机推荐

  1. 02.从0实现一个JVM语言之词法分析器-Lexer-03月02日更新

    从0实现JVM语言之词法分析器-Lexer 本次有较大幅度更新, 老读者如果对前面的一些bug, 错误有疑问可以复盘或者留言. 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个s ...

  2. Python切换版本工具pyenv

    目录 安装pyenv 安装与查看py版本 切换py版本 结合ide使用示例 和virtualenv的一些区别 参考文献 使用了一段时间,我发现这玩意根本不是什么神器,简直就是垃圾,安装多版本总是失败, ...

  3. rest framework Genericview

    通用视图 Django的通用视图...被开发为普通使用模式的快捷方式......他们采取某些共同的习惯和模式的发展观和抽象,从而使您可以快速地将数据写入的共同看法,而不必重复自己发现的. - Djan ...

  4. synchronized中锁是怎么升级的

    在JDK1.6以前,使用synchronized就只有一种方式即重量级锁,而在JDK1.6以后,引入了偏向锁,轻量级锁,重量级锁,来减少竞争带来的上下文切换. 锁升级主要依赖对象头中的Mark Wor ...

  5. 解决springMVC https环境 jstlview redirect时变为http请求的问题

    <property name="redirectHttp10Compatible" value="false" />

  6. [unknown source] 整数拆分

    一.题目 题目描述 定义一个整数拆分序列 \(a\) 的权值为: \[\sum_{i=1}^n\sum_{j=1}^{i-1}\gcd(a_i,a_j) \] 求对于一个整数 \(n\) 所有整数拆分 ...

  7. Python中异步协程的使用方法介绍

    1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...

  8. Ubuntu18.04安装MySQL(未设置密码或忘记密码)

    一 安装MySQL sudo apt-get update sudo apt-get install mysql-server 二 密码问题 1 安装时提示设置密码 这种情况没什么问题,通过已下命令登 ...

  9. vue封装公用弹出框方法,实现点击出现操作弹出框

    vue封装公用弹出框方法,实现点击出现操作弹出框 如上图所示,这次要实现一个点击出现操作弹框的效果:并将这个功能封装成一个函数,便于在项目的多个地方使用. 具体思路是: 封装一个组件,组件保护一个插槽 ...

  10. 前端学习 node 快速入门 系列 —— 报名系统 - [express]

    其他章节请看: 前端学习 node 快速入门 系列 报名系统 - [express] 最简单的报名系统: 只有两个页面 人员信息列表页:展示已报名的人员信息列表.里面有一个报名按钮,点击按钮则会跳转到 ...