Static块和类加载顺序
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11451040.html
版本:Java8
直接上代码:
public class StaticMain {
public static int i = 200;
{
i = 100;
}
public static void main(String[] args){
System.out.println(i);
}
}
结果:

继续上代码:
public class StaticMain {
{
i = 100;
}
public static int i = 200;
public static void main(String[] args){
System.out.println(i);
}
}
结果:

继续上代码:
public class StaticMain {
{
i = 100;
System.out.println(i + " : static");
}
public static int i = 200;
public static void main(String[] args){
System.out.println(i + " : main");
}
}
结果:

继续上代码:
public class StaticMain {
public static int i = 200;
{
i = 100;
System.out.println(i + " : static");
}
public static void main(String[] args){
System.out.println(i + " : main");
}
}
结果:

继续上代码:
public class StaticMain {
public static int i;
{
i = 100;
System.out.println(i + " : static");
}
public static void main(String[] args){
System.out.println(i + " : main");
}
}
结果:

继续上代码:
public class StaticMain {
public static int i;
{
i = 100;
System.out.println(StaticMain.i + " : static");
}
public static void main(String[] args){
System.out.println(StaticMain.i + " : main");
}
}
结果:

接下来改变一下:
继续上代码:
public class StaticMain {
public static int i;
{
i = 100;
System.out.println(StaticMain.i + " : static");
}
public static void main(String[] args){
StaticMain staticMain = new StaticMain();
System.out.println(StaticMain.i + " : main");
}
}
结果:

继续上代码:
public class StaticMain {
public static int i = 200;
{
i = 100;
System.out.println(StaticMain.i + " : static");
}
public static void main(String[] args){
StaticMain staticMain = new StaticMain();
System.out.println(StaticMain.i + " : main");
}
}
结果:

继续上代码:
public class StaticMain {
{
i = 100;
System.out.println(StaticMain.i + " : static");
}
public static int i = 200;
public static void main(String[] args){
StaticMain staticMain = new StaticMain();
System.out.println(StaticMain.i + " : main");
}
}
结果:

结论: 静态块中的变量是先拿到定义再在后续拿到实际变量之后再进行后续对变量的操作的; 如果不初始化静态块所属类,静态块将不会因为他的所属类的调用而被加载.
附:类初始化时的顺序:
1、类内容(静态变量、静态初始化块) => 实例内容(变量、初始化块、构造器)
2、父类的(静态变量、静态初始化块)=> 子类的(静态变量、静态初始化块)=> 父类的(变量、初始化块、构造器)=> 子类的(变量、初始化块、构造器)
结束
Static块和类加载顺序的更多相关文章
- java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)
java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...
- Java 的类加载顺序
Java 的类加载顺序 一.加载顺序:先父类后子类,先静态后普通 1.父类的静态成员变量初始化 2.父类的静态代码块 3.子类的静态成员变量初始化 4.子类的静态代码块 5.父类的普通成员变量初始化 ...
- Java 中(静态)变量、(静态)代码块的执行顺序
Java 中(静态)变量.(静态)代码块的执行顺序 非原创 本文讨论 Java 中(静态)变量.(静态)代码块的执行顺序 首先创建 3 个类 1.Foo 类 public class Foo { pu ...
- Java(静态)变量和(静态)代码块的执行顺序
本文讨论Java中(静态)变量.(静态)代码块的执行顺序 首先创建3个类: 1.Foo类,用于打印变量 public class Foo { public Foo(String word) { Sys ...
- java的static块及相关内容
原文地址:http://blog.csdn.NET/lubiaopan/article/details/4802430 感谢原作者! static{}(即static块),会在类被加载的时候执 ...
- Java面试--类加载顺序
类什么时候就行初始化: 1)创建类的实例,也就是new一个对象 2)访问某个类或接口的静态变量,或者对该静态变量赋值 3)调用类的静态方法 4)反射(Class.forName(“com.fan ...
- Java类加载顺序练习题
一.题目 public class Test { public static Test t1 = new Test();// 标记1 // 普通代码块 { System.out.println(&qu ...
- tomcat6类加载器与类加载顺序
tomcat6.0.32 com.dyyx.ShareUtils//返回系统当前时间public static String now(); package com.dyyx;import java.t ...
- java的static块执行时机
一.误区:简单认为JAVA静态代码块在类被加载时就会自动执行.证错如下: class MyClass1 { static {//静态块 System.out.println("static ...
随机推荐
- .NetCore下构建自己的服务配置中心-手动造轮子
本人主要利用IdentityServer4以及SignalR来实现,IdentityServer4作为认证,SignalR来交互配置,这里一些代码可能就是部分提出来,主要介绍实现原理及方法 实现配置中 ...
- springboot插件打包跳过单元测试
只需在pom.xml添加如下即可 <skipTests>true</skipTests> pom文件如下 <?xml version="1.0" en ...
- 第10组 Alpha冲刺 (4/6)
1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/13982696.html ·作业博客:https://edu.cnblogs.co ...
- vue 前进刷新后退不刷新
这边是router-view部门的写法: <keep-alive> <router-view v-if="$route.meta.keepAlive"/> ...
- 帮你克服web字体选择焦虑症
1.背景 前端时间产品经理问我,移动端web默认字体有哪些,哪些字体不侵权?我当时感觉这方面的知识很匮乏,只能回答出微软雅黑和苹方简体,平常写代码时,没怎么留意过font-family设置的字体属性, ...
- FIS 使用
从淘宝npm镜像安装fis $ npm install -g fis --registry=https://registry.npm.taobao.org 安装less插件 $ npm install ...
- 性能优化-使用双buffer实现无锁队列
借助本文,实现一种在"读多写一"场景下的无锁实现方式 在我们的工作中,多线程编程是一件太稀松平常的事.在多线程环境下操作一个变量或者一块缓存,如果不对其操作加以限制,轻则变量值或者 ...
- Javascript实现让小图片一直跟着鼠标移动
Javascript实现让小图片一直跟着鼠标移动实例 注意:图片可能加载不出来,注意更换 <!doctype html> <html> <head> <met ...
- 【刷题-LeetCode】223. Rectangle Area
Rectangle Area Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectang ...
- linux中shell编程 -->三剑客习题汇总
目录 1.找出/proc/meminfo文件中以s开头的行,至少用三种方式忽略大小写 2.显示当前系统上的以root,centos或者user开头的信息 3.找出/etc/init.d/functio ...