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.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方 ...
随机推荐
- 从零开始使用 webpack5 搭建 react 项目
本文的示例项目源码可以点击 这里 获取 一.前言 webpack5 也已经发布一段时间了,其模块联邦.bundle 缓存等新特性值得在项目中进行使用.经过笔者在公司实际项目中的升级结果来看,其提升效果 ...
- 在Arch上使用Fcitx5
目录 卸载Fcitx4 安装Fcitx5 配置 修改环境变量 系统登陆后默认启动Fcitx5输入法 配置主题 最终使用效果 参考文档 我是一个Arch+KDE的用户,所以下面的方法可能不适合所有的Li ...
- 京东 Vue3 组件库闪亮登场
京东零售开源项目 NutUI 是一套京东风格的轻量级移动端 Vue 组件库,是开发和服务于移动 Web 界面的企业级产品.经过长时间的开发与打磨,NutUI 3.0 终于要和大家见面了!3.0 版本在 ...
- Debian中的NVIDIA显卡驱动安装——超简单,一行命令
其实Debian的non-free固件中包含NVIDIA的显卡驱动,所以没必要在官网下run包一步一步来 sudo apt install nvidia-settings 安装时会提示与X冲突,没关系 ...
- 线上MySQL读写分离,出现写完读不到问题如何解决
大家好,我是历小冰. 今天我们来详细了解一下主从同步延迟时读写分离发生写后读不到的问题,依次讲解问题出现的原因,解决策略以及 Sharding-jdbc.MyCat 和 MaxScale 等开源数据库 ...
- 华为OD机试题
"""最长回文字符串问题"""# 说明:方法很多,这个是最简单,也是最容易理解的一个,利用了动态规化.# 先确定回文串的右边界i,然后以右边 ...
- WPF 基础 - MultiBinding
MultiBinding 与 Binding 一样继承自 BindingBase,因此可以使用 Binding 的地方都可以使用 MultiBinding. namespace System.Wind ...
- c/c++ switch case内括号
如果在case语句中有定义变量,则必须要加{},否则会报错.
- TEB 、TIB、PEB--Vista 32
TEB struct TEB typedef struct _TEB { NT_TIB NtTib; PVOID EnvironmentPointer; CLIENT_ID ClientId; PVO ...
- APK瘦身属性——android:extractNativeLibs
先描述一下结论: android:extractNativeLibs = true时,gradle打包时会对工程中的so库进行压缩,最终生成apk包的体积会减小. 但用户在手机端进行apk安装时,系统 ...