由阿里巴巴笔试题看java加载顺序
一、阿里巴巴笔试题:
public class T implements Cloneable {
public static int k = 0;
public static T t1 = new T("t1");
public static T t2 = new T("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造块");
}
static {
print("静态块");
}
public T(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);
++n;
return ++i;
}
public static void main(String[] args) {
}
}
二、加载过程分析:
执行main时,先加载所在类,声明静态变量,并初始化静态变量执行静态代码块(按顺序执行)
初始化到t1时,暂停类加载,先实例化,此时k=0,而i,n都未初始化,系统默认值为0
初始化j时,k自增为1,i,n为0,输出“1:j i=0 n=0”,n,i自增为1
执行代码块,输出“2:构造块 i=1 n=1”,n,i自增为2
执行构造函数,输出“3:t1 i=2 n=2”,n,i自增为3
初始化到t2时,暂停类加载,先实例化,此时k=3,i,n都还未初始化,但已自增为3
初始化j时,k自增为4,i,n未初始化为3,输出“4:j i=3 n=3”,n,i自增为4
执行代码块,输出“5:构造块 i=4 n=4”,n,i自增为5
执行构造函数,输出“6:t2 i=5 n=5”,n,i自增为6
初始化i,输出“7:i i=6 n=6”,n,i自增为7,返回自增后的i赋值给i
初始化n,赋值99
执行静态块,输出“8:静态块 i=7 n=99”,i自增为8,n自增为100
完成类加载
三、涉及知识点:
1.类加载过程:
加载某类前先加载其父类
加载某类时,先声明静态成员变量,初始化为默认值,再初始化静态成员变量执行静态代码块
初始化静态成员变量执行静态代码块时,是按顺序执行(初始化静态成员变量的本质就是静态代码块)
2.实例化过程:
对某类实例化前,先对其父类进行实例化
实例化某类时,先声明成员变量,初始化为默认值,再初始化成员变量执行代码块
初始化成员变量执行代码块时,是按顺序执行
3.在某类加载过程中调用了本类实例化过程(如new了本类对象),则会暂停类加载过程先执行实例化过程,执行完毕再回到类加载过程
4.类的主动使用与被动使用:
主动使用例子:
1):最为常用的new一个类的实例对象
2):直接调用类的静态方法。
3):操作该类或接口中声明的非编译期常量静态字段
4):反射调用一个类的方法。
5):初始化一个类的子类的时候,父类也相当于被程序主动调用了
(如果调用子类的静态变量是从父类继承过来并没有复写的,那么也就相当于只用到了父类的东东,和子类无关,
所以这个时候子类不需要进行类初始化)。
6):直接运行一个main函数入口的类。
所有的JVM实现,在首次主动使用某类的时候才会加载该类。
被动使用例子:
7):子类调用父类的静态变量,子类不会被初始化。只有父类被初始化。对于静态字段,只有直接定义这个字段的类才会被初始化.
8):通过数组定义来引用类,不会触发类的初始化,如SubClass[] sca = new SubClass[10];
9):访问类的编译期常量,不会初始化类
5.编译期常量:
写到类常量池中的类型是有限的:String和几个基本类型
String值为null时,也不会写到类常量池中
使用new String("xx")创建字符串时,得到的字符串不是类常量池中的
6.对于通过new产生一个字符串(假设为 ”china” )时,会先去常量池中查找是否已经有了 ”china” 对象,
如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此 ”china” 对象的拷贝对象。
7.类成员变量才会有默认的初始值
byte:0(8位)
short:0(16位)
int:0(32位)
long:0L(64位)
char:\u0000(16位),代表NULL
float:0.0F(32位)
double:0.0(64位)
boolean: flase
8.局部变量声明以后,Java 虚拟机不会自动的为它初始化为默认值。
因此对于局部变量,必须先经过显示的初始化,才能使用它。
如果编译器确认一个局部变量在使用之前可能没有被初始化,编译器将报错。
9.数组和String字符串都不是基本数据类型,它们被当作类来处理,是引用数据类型。
引用数据类型的默认初始值都是null
由阿里巴巴笔试题看java加载顺序的更多相关文章
- 从阿里巴巴笔试题看Java加载顺序
一.阿里巴巴笔试题: public class T implements Cloneable { public static int k = 0; public static T t1 = new T ...
- 由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序
一.阿里巴巴笔试题: public class Test { public static int k = 0; public static Test t1 = new Test("t1&qu ...
- (转)面试题--JAVA中静态块、静态变量加载顺序详解
public class Test { //1.第一步,准备加载类 public static void main(String[] args) { new Test(); //4.第四步,new一个 ...
- 【笔试题】Java笔试题知识点
Java高概率笔试题知识点 Java语法基础部分 [解析]java命令程序执行字节码文件是,不能跟文件的后缀名! 1.包的名字都应该是由小写单词组成,它们全都是小写字母,即便中间的单词亦是如此 2.类 ...
- Java加载资源文件的两种方法
处理配置文件对于Java程序员来说再常见不过了,不管是Servlet,Spring,抑或是Structs,都需要与配置文件打交道.Java将配置文件当作一种资源(resource)来处理,并且提供了两 ...
- java中静态变量,静态代码块,静态方法,实例变量,匿名代码块等的加载顺序
转自:http://blog.csdn.net/mrzhoug/article/details/51581994 一.在Java中,使用”{}”括起来的代码称为代码块,代码块可以分为以下四种: 1.普 ...
- java中带继承类的加载顺序详解及实战
一.背景: 在面试中,在java基础方面,类的加载顺序经常被问及,很多时候我们是搞不清楚到底类的加载顺序是怎么样的,那么今天我们就来看看带有继承的类的加载顺序到底是怎么一回事?在此记下也方便以后复习巩 ...
- Java 类中各成分加载顺序 和 内存中的存放位置
参加一个笔试,有一个关于类的静态代码块.构造代码块.构造函数的执行顺序的问题.不太清楚,网上百度了一下.在这里记录一下. 一.什么时候会加载类?使用到类中的内容时加载:有三种情况1.创建对象:new ...
- Java 中类的加载顺序
如果类A和类B中有静态变量,静态语句块,非静态变量,非静态语句块,构造函数,静态方法,非静态方法,同时类A继承类B,请问当实例化A时,类内部的加载顺序是什么? 测试代码如下: Class B: pub ...
随机推荐
- foj 2044 1 M possible 二进制压缩
题目链接: http://acm.fzu.edu.cn/problem.php?pid=2044 题意: 给出 一大堆数,找出2个出现次数模3 为1 的两个数字 题解: 把一个数分为几位拆开统计 ...
- Posix线程编程指南(1) 线程创建与取消
线程创建 1.1 线程与进程 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列.在串行程序基础上引入线程和进程是为了提高程序的 ...
- JS 学习笔记--8---Function类型
练习使用的浏览器IE11 JS 中Function类型实际上是一种对象,每一个函数实际上都是Function类型的一个实例,每一个函数都有一些默认的属性和方法.由于函数是对象,故函数名实际上也是一 ...
- 【UOJ Easy Round #2】
然而UER我也照样跪…… 第一题 忘了取模sad || 操作符将整个区间分成了一些段,每个手机只会执行其中某一段,执行次数为这一段中&&的个数?+1? ans=ans*num[i]+1 ...
- Core Data 版本数据迁移
Core Data版本迁移基础 通常,在使用Core Data的iOS App上,不同版本上的数据模型变更引发的数据迁移都是由Core Data来负责完成的.这种数据迁移模式称为Lightweight ...
- PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)(转)
面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交 ...
- CSS兼容问题大全
1.chorme 最小字体的兼容性. 问题描述:ff和IE最小字体可设置为1px,可是chorme中文版最小字体是12px,小于12px的字体全部显示为12px.解决方案:chorme支持CSS3的, ...
- Lua require搜索路径指定方法
在自己的lua文件中,如果使用到了自己写的C库或者第三方库,想让lua编译到自己指定的目录下寻找*.lua或*.so文件的时候,可以再自己的Lua代码中添加如下代码,可以指定require搜索的路径. ...
- 关于“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题
费劲N多力气编译通过之后,最后启动程序过程中却突然得到“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题, 分析究其原因是定位不到zlib1.dll,都知道,程序在找dll的时 ...
- LCA 笔记
简述这几天的LCA 心得: LCA有两种做法:离线 or 在线 先学的离线: 原理博客很多. 我写得两道题,已经模板. HDU:http://acm.hdu.edu.cn/showproblem.ph ...