测试代码:  

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. Django批量插入数据和分页器

    目录 一.ajax结合sweetalert实现删除按钮动态效果 二.bulk_create批量插入数据 1. 一条一条插入 2. 批量插入 三.自定义分页器 一.ajax结合sweetalert实现删 ...

  2. 五. SpringCloud服务降级和熔断

    1. Hystrix断路器概述 1.1 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败.这就造成有可能会发生服务雪崩.那么什么是服务雪崩呢 ...

  3. Python3+pygame实现的俄罗斯方块 代码完整 有演示效果

    一.简单说明 80.90后的小伙伴都玩过"俄罗斯方块",那种"叱咤风云"场景 偶尔闪现在脑海 真的是太爽了:如果没有来得及玩过的同学,这次可以真正的自己做一个了 ...

  4. 别再恐惧 IP 协议(万字长文 | 多图预警)

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ...

  5. mpvue 开发微信小程序搭建项目

    首先 mpvue 是一款基于vue的框架,mpvue 修改了 Vue.js 的 runtime 和 compile 实现,可以运行在小程序的环境中. 第一步:安装 vue-cli vue-cli是vu ...

  6. Redis基础及其相关面试题

    Redis持久化 一.持久化简介 Redis 的数据 全部存储 在 内存 中,如果 突然宕机,数据就会全部丢失,因此必须有一套机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis ...

  7. ES6学习笔记(3)- 对象的功能性扩展

    一.什么是对象字面量 对象字面量就是创建对象(Object)的一种简单容易理解的方式,再通俗点就是所谓的键值对的集合.举个简单的例子: let book = { name: 'JavaScript', ...

  8. BZOJ_2844 albus就是要第一个出场 【线性基】

    一.题目 albus就是要第一个出场 二.分析 非常有助于理解线性基的一题. 构造线性基$B$后,如果$|A| > |B|$,那么就意味着有些数可以由$B$中的数异或出来,而多的数可以取或者不取 ...

  9. java 动态规划解决上楼梯问题

    问题描述: 你正在爬楼梯. 它需要n步才能达到顶峰. 每次你可以爬1或2步. 您可以通过多少不同的方式登顶? 注意:给定n将是一个正整数. Example 1: Input: 2 Output: 2 ...

  10. js_笔记_8月7日记录_活动对象_作用域链_按值传递

    活动对象:简单说就是这个函数的参数和显示声明的变量或函数. 函数内接受的参数实际是创建了一个局部变量:[形参名] = [传进来的值],js的函数传参只传值. 作用域链:执行流进入一个函数,会先创建出作 ...