面试题--JAVA中静态块、静态变量加载顺序
最后给大家一道面试题练练手,要求写出其结果(笔试)
- public class StaticTest {
- public static int k = 0;
- public static StaticTest t1 = new StaticTest("t1");
- 代码执行完这一行发生了什么?之所以会执行这行代码,是main方法里面第一次 new的缘故,第一次new,会加载这个类的static变量,static方法(不执行)和static块,因为 t1 是static,所以会执行这一行代码 但 t1 这里又new了一个StaticTest对象,由于在main方法里面已经new了一个,所以这里new的不再加载static变量和块,只初始化变量j,加载构造快和构造函数,在加载 j 时,又需要用到static变量 i 和 n ,但此时并未给 i 和 n 初始化(因为还没有执行到给 i 和 n 初始化的代码),所以此时的 i 和 n 用默认值 0 ! 我去。。。。
- 当代吗执行到这时,jvm如何知道这已经是第二次new了?因为类加载过程中存在一个准备阶段,这个阶段是在方法区中为所有类变量赋初值(除了static final是直接赋了指定值);然后才到了类初始化阶段,这里执行到new实际上是到了类初始化阶段,这时方法区已经有了这个类的信息了,所以jvm才知道这不是第一次new;
注:main方法所在类,是被隐式初始化了,但没有被实例化
- public static StaticTest t2 = new StaticTest("t2");
- public static int i = print("i");
- public static int n = 99;
- public int j = print("j");
- {
- print("构造块");
- }
- static{
- print("静态块");
- }
- public StaticTest(String str) {
- System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
- ++n;
- ++i;
- }
- public static int print(String str) {
- System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
- ++i;
- return ++n;
- }
- public static void main(String[] args) {
- StaticTest t = new StaticTest("init");
- }
- }
结果:
- 1:j i=0 n=0
- 2:构造块 i=1 n=1
- 3:t1 i=2 n=2
- 4:j i=3 n=3
- 5:构造块 i=4 n=4
- 6:t2 i=5 n=5
- 7:i i=6 n=6
- 8:静态块 i=7 n=99
- 9:j i=8 n=100
- 10:构造块 i=9 n=101
- 11:init i=10 n=102
这个留给大家去思考,如果一眼便能便知道为什么是这样的输出结果,那么静态方面知识应该比较扎实了
感悟:
提示一下 :
1.加载的顺序:先父类的static成员变量 -> 子类的static成员变量 -> 父类的成员变量 -> 父类构造 -> 子类成员变量 -> 子类构造
2.static只会加载一次,所以通俗点讲第一次new的时候,所有的static都先会被全部载入(以后再有new都会忽略),进行默认初始化。在从上往下进行显示初始化。这里静态代码块和静态成员变量没有先后之分,谁在上,谁就先初始化
3.构造代码块是什么?把所有构造方法中相同的内容抽取出来,定义到构造代码块中,将来在调用构造方法的时候,会去自动调用构造代码块。构造代码快优先于构造方法。
面试题--JAVA中静态块、静态变量加载顺序的更多相关文章
- (转)面试题--JAVA中静态块、静态变量加载顺序详解
public class Test { //1.第一步,准备加载类 public static void main(String[] args) { new Test(); //4.第四步,new一个 ...
- JAVA中静态块、静态变量加载顺序详解
http://blog.csdn.net/mrzhoug/article/details/51581994 一般顺序:静态块(静态变量)——>成员变量——>构造方法——>静态方法
- Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序
直接上代码: 代码1: public class ConstroctTest { private static ConstroctTest test = new ConstroctTest(); // ...
- IDEA中Springboot静态文件加载(热部署)
Springboot项目静态文件加载 昨天写项目的时候碰到一个问题,就是静态文件css无法读取到项目中,我仔细思考了下,总结了下,可能有两个问题 1.页面未加载更新 这个可能性非常大,Chrome就是 ...
- 【java虚拟机系列】java中类与对象的加载顺序
首先了解一下Java虚拟机初始化的原理. JVM通过加装.连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用.类型的生命周期如下图所示: 装载和连接必须在初始化之前就要完成. 类 ...
- jsp页面中的代码执行加载顺序介绍
1. java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascript和html都是在浏览器端运行的代码.所以加载执行顺序是是java>jsp>js. 2. j ...
- web工程中web.xml元素加载顺序以及配置实例
简介 web.xml是web工程的配置文件,容器加载web工程时,会首先从WEB-INF中查询web.xml,并加载其中的配置信息,可以将web.xml认为是web工程的入口. web.xml中包含有 ...
- java中的静态变量、静态方法与静态代码块详解与初始化顺序
我们知道类的生命周期分为装载.连接.初始化.使用和卸载的五个过程.其中静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...
- java中的静态变量,静态方法与静态代码块详解
java中的类的生命周期分为装载,连接,初始化,使用,和卸载五个过程. 而静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...
随机推荐
- sublimelinter-php 错误代码提示
先安装 SublimeLinter 如同其他插件一样使用 Package Control 来安装. 按下 Ctrl+Shift+p 进入 Command Palette 输入install进入 Pac ...
- 关于checkbox对应一张表时如何遍历
html代码: <table> <tr> <td><input name='one' type='checkbox' value='1'/></t ...
- 3-C++程序的结构1.4
共享数据的保护 对于既需要共享.又需要防止改变的数据应该声明为常量. 1.常引用 如果在声明引用时用const修饰,被声明的引用就是常引用.常引用所引用的对象不能被更新.声明形式如下: const 类 ...
- Flutter实战视频-移动电商-61.购物车_商品数量的加减操作
61.购物车_商品数量的加减操作 provide/cart.dart pages/cart_page/cart_count.dart 先引入provide和cartProvide 定义接收一个item ...
- Installing cmake 2.8.8 or higher on Ubuntu 12.04 (Precise Pangolin) (转载)
转自:http://cameo54321.blogspot.com/2014/02/installing-cmake-288-or-higher-on.html Check the version o ...
- Bootstrap表格分页(一)
最近在学习Bootstrap的分页,有一种方法用“Bootstrap-Paginator”的东西来做. 先预览一下: 为了能够局部刷新页面,我创建了一个PartialView 页面的HTML部分如下: ...
- TP5之查询那些事
1.使用 model 查询,查出的类型为 对象 $a 是一个对象,使用 $a->name 的方式来获取 对象里的属性 2.使用 db 查询,查询出的是 数组 $b 是一个数组,使用 $b['na ...
- 算法学习--Day7
今天多做一些杂题练习一下. 第一题: 题目描述 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别.我们给出 ...
- U3D开发性能优化笔记(待增加版本.x)
http://blog.csdn.net/kaitiren/article/details/45071997 此总结由自己经验及网上收集整理优化内容 包括: .代码方面: .函数使用方面: .ui注意 ...
- 海思3559A QT 5.12移植(带webengine 和 opengl es)
海思SDK版本:Hi3559AV100_SDK_V2.0.1.0 编译器版本:aarch64-himix100-linux-gcc 6.3.0(这个版本有点小问题,使用前需要先清除本地化设置) $ e ...