Java类初始化执行流程
测试代码:
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类初始化执行流程的更多相关文章
- Java类初始化
Java类初始化 成员变量的初始化和构造器 如果类的成员变量在定义时没有进行显示的初始化赋值,Java会给每个成员变量一个默认值 对于 char.short.byte.int.long.float. ...
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public H ...
- 【知识总结】Java类初始化顺序说明
微信公众号:努力编程的小猪如有问题或建议,请公众号留言 Java类初始化顺序说明 一个类中包含如下几类东西,他们前后是有顺序关系的 静态属性:static 开头定义的属性 静态方法块: static ...
- 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程
003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程 Java程序长啥样? 首先编写一个Java程序 记事本编写程序 打开记事本 1.wi ...
- [读书笔记] java类初始化
以下内容来自周志明的<深入理解java虚拟机>: 类初始化阶段是类加载过程的最后一步,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导 ...
- Android(java)学习笔记136:Java类初始化顺序
Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论: 1 .继承体系的所有静态成员初始化( ...
- Java的初始化执行顺序(父类static变量->子类static变量->父类成员变量->父类构造器->成员变量->构造器->main函数)
1. 引言 了解Java初始化的顺序,有助于理解Java的初始化机制和内存机制. 顺序:父类static变量->子类static变量->父类成员变量->父类构造器->成员变量- ...
- [1]朝花夕拾-JAVA类的执行顺序
最近在温习java的基础,刷题刷到java的执行顺序,很汗颜,答案回答错了! 题目类似如下: package com.phpdragon.study.base; public class ExecOr ...
- 转!!关于java类初始化顺序
原文地址:http://www.cnblogs.com/luckygxf/p/4796955.html 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方 ...
随机推荐
- 10万级etl调度软件Taskctl-web版免费授权及产品功能特性
转: 10万级etl调度软件Taskctl-web版免费授权及产品功能特性 初识Taskctl-Web版 Taskctl Free应用版原型是在原有商用版Taskctl 6.0衍生扩展开发出的专门为批 ...
- .net Core 上传文件详解
.net core 和.net framework上传文件有很多需要注意的地方 .net framework 上传文件用httppostedfilebase .net core 上传文件用 IForm ...
- PHP题库1
选择题11. php中,不等运算符是( B.C ) A ≠ B != C <> D >< 2. 函数的参数传递包括:( A.B ) A 按值传递 B ...
- Linux速通05 文件处理与编辑
使用 cat 命令进行文件的纵向合并 # 例:使用 cat 命令将 baby.age.baby.weight.baby.sex 这三个文件纵向合并为 baby文件 * cat baby.age bab ...
- python基础(8)python中is和==的区别详解
前置知识点 当我们创建一个对象时,我们要知道它内部干了些什么 1.创建了一个随机id,开辟了一片内存地址 2.自动声明了这个对象的类型type 3.给这个对象赋值value 小例子 a = 1 pri ...
- FreeBSD安装xorg + xfce 4
FreeBSD安装xorg,以及xfce 安装xorg 可选包 -xorg 完整xorg环境包 -xorg-minimal xorg最小化包 ports安装 cd /usr/ports/x11/xor ...
- MyBatis(九):MyBatis类型处理器(TypeHandler)详解
TypeHandler简介 TypeHandler,顾名思义类型转换器,就是将数据库中的类型与Java中的类型进行相互转换的处理器. MyBatis 在设置预处理语句(PreparedStatemen ...
- ArrayList 、Vector 和 LinkedList 有什么区别?
ArrayList.Vector .LinkedList 类均在java.util 包中,均为可伸缩数组,即可以动态改变长度的数组. ArrayList 和 Vector 都是基于存储元素的 Obje ...
- 常用开发库 - 告別BeanUtils拷贝,MapStruct工具库最全详解
常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...
- python学习8 文件的操作
本文拷贝了on testing 的<python之文件操作:文件的读写>,只做学习之用 python的文件读写通过 一.用open函数 二.对文件读写操作 三.读取文件位置定位 1. op ...