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 ...
随机推荐
- Java面向对象笔记 • 【第10章 Swing编程初级应用】
全部章节 >>>> 本章目录 10.1 JFrame窗口容器 10.1.1 Swing介绍 10.1.2 JFrame窗口容器应用 JFrame常用方法 10.1.3 实践 ...
- xpath如何使用正则、xpath定位svg标签、xpath常用集合
自己用到的xpath都收集下咯!!! 持续更新本页面 xpath查找svg图标 xpath('//*[local-name() = "svg" and @class="_ ...
- .net core中Grpc使用报错:Request protocol 'HTTP/1.1' is not supported.
显然这个报错是说HTTP/1.1不支持. 首先,我们要知道,Grpc是Google开源的,跨语言的,高性能的远程过程调用框架,它是以HTTP/2作为通信协议的,所以当我启动启用一个服务作为Grpc的服 ...
- 图像数据到网格数据-3——实现Cuberille算法
前言 这是本博客网格生成算法系列的第三篇,第一篇里面介绍了最为流行的MarchingCubes算法,第二篇中使用新三角形表来对MC算法进行了简化改进,形成了SMC算法.而这篇将介绍一种新的不同与MC算 ...
- git 忽略本地文件的修改
项目开发过程中,会遇到本地配置文件每个开发人员不同的情况,但如果遇到类似数据库配置这种最终需要加入 git 版本控制的配置,则会陷入两难境地.要么不跟踪,要么有人提交后其他人同步下来必须手动修改,非常 ...
- spring boot 解决 跨域 的两种方法 -- 前后端分离
1.前言 以前做项目 ,基本上是使用 MVC 模式 ,使得视图与模型绑定 ,前后端地址与端口都一样 , 但是现在有些需求 ,需要暴露给外网访问 ,那么这就出现了个跨域问题 ,与同源原则冲突, 造成访问 ...
- centos 操作系统优化
命令提示符优化 修改PS1环境变化 vim /etc/profile #在最后一行添加 export PS1='[\u@\H \w]$' \u ---显示当前登录用户名称 \h ---显示系统主机名称 ...
- MySQL提权之mof提权
mof提权原理 关于 mof 提权的原理其实很简单,就是利用了 c:/windows/system32/wbem/mof/ 目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次 ...
- Visual Studio 2019 与 Visual Studio 2022的下载方式
相信大家目前百度或者其他搜索引擎搜索到的都是2022了,那么vs2019该如何安装呢? vs2019下载地址:https://visualstudio.microsoft.com/zh-hans/th ...
- JUC之线程池基础
线程池 定义和方法 线程池的工作时控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完成,再从队列中取出任 ...