Java类加载信息的顺序:包括静态代码快、静态类变量、非静态代码快、构造方法、普通方法
JVM运行之前会执行一个叫做类加载器的子系统,叫做ClassLoader,那么类里面那么多“元素”,究竟是个什么顺序呢,写几行代码测试一下,通过给每个方法和代码快和静态变量打上断点来测试:
class Person {
private String name;
public Person(String name) {
method();
this.name = name;
method();
}
static String password = "123";
static {
System.out.println("静态代码快");
}
static String tell = "123456789";
{
System.out.println("普通代码快代码快");
}
public void method() {
System.out.println(name);
System.out.println("普通方法");
}
public static void main(String[] args) {
new Person("Jay");
}
}
// 输出结果:
// 静态代码快
// 普通代码快代码快
// null
// 普通方法
// Jay
// 普通方法
结果显示:
1.静态代码块/静态类变量(二者很相似,都是以static开头,只不过一个是只有一个变量,另外一个是代码快而已,他们的地位是平等的,谁写在前面就谁先执行)
=>2.非静态代码快
=>3.构造方法
=>4.在静态方法中初始化非静态成员变量
事实上,很多时候我们在构造方法里面做一些事情,我们都很喜欢直接把需要做的事情放在this.name = name之后,这样做其实是很好的,因为在赋值完毕之后其实对象就已经构造出来了,而不是等到构造方法的最后一个"}"完了之后才算构造完毕。甚至 有些时候我们如果不需要使用成员变量,把需要做到事情写在构造方法的第一行都是可以的,这个时候其实对象已经构造出来,只不过没有初始化成员变量而已,但是又一点,如果需要在子类调用父类构造方法,那就必须要把父类的构造方法写在第一行,不然编译通不过。
那么:由此我们推到子类继承父类的时候,又是什么情况呢,下面代码:
class Person {
private String age;
public Person() {
method1();
System.out.println("父类构造方法");
method1();
}
static String Email = "123@qq.com";
static {
System.out.println("父类静态代码块");
}
static String address = "四川成都";
{
System.out.println("父类非静态代码块");
}
public void method1() {
System.out.println(age);
}
}
public class Chinese extends Person {
private String name;
public Chinese(String name) {
method();
this.name = name;
method();
}
static String password = "123";
static {
System.out.println("静态代码快");
}
static String tell = "123456789";
{
System.out.println("普通代码快代码快");
}
public void method() {
System.out.println(name);
System.out.println("普通方法");
}
public static void main(String[] args) {
new Chinese("Jay");
}
}
// 父类静态代码块
// 静态代码快
// 父类非静态代码块
// null
// 父类构造方法
// null
// 普通代码快代码快
// null
// 普通方法
// Jay
// 普通方法
总结:不难看出,首先是父类静态变量/静态代码块 => 子类静态变量/静态代码块 => 父类非静态代码快 => 父类构造方法 => 子类非静态代码快 => 子类构造方法 => 其他
跟上面不谋而合,在一个类中,静态的首先执行,也就是当JVM启动之后,类加载器把静态的变量加载进去,不用执行其他方法就已经把静态的东西执行了,然后就是非静态的代码块,再之后才是构造方法,而在构造方法里面是按照顺序执行的(这是废话,同一个方法里面的代码本来就是按顺序执行的)。
说明:静态代码块和静态类变量的执行顺序可以通过打断点的方式得出上诉结论,就是谁在前面就先执行谁,二者的地位是平等的。
Java类加载信息的顺序:包括静态代码快、静态类变量、非静态代码快、构造方法、普通方法的更多相关文章
- Java程序员的日常 —— Java类加载中的顺序
之前说过Java中类的加载顺序,这次看完继承部分,就结合继承再来说说类的加载顺序. 继承的加载顺序 由于static块会在首次加载类的时候执行,因此下面的例子就是用static块来测试类的加载顺序. ...
- java类加载时执行顺序
源代码 class HelloA { public HelloA() { System.out.print("A"); } { System.out.print("B&q ...
- 如何在ARC代码中混编非ARC代码
“ios中如果arc和非arc文件混编,可以在build parses中指定compile flags,如果arc文件设为"-fobjc-arc",非arc文件设为"-f ...
- [ios]如何在ARC代码中混编非ARC代码
参考 :http://blog.sina.com.cn/s/blog_b595ce9e0101nvvn.html “ios中如果arc和非arc文件混编,可以在build parses中指定compi ...
- java基础-静态,非静态(构造)代码块,类加载
static block and non-static block(constructor block) [toc] 想来想去,先来一题比较好 public class Foo { public st ...
- java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数
一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构
- Java子父类间静态代码块、非静态代码块、构造方法的执行顺序
子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A ...
- 《Java编程思想》学习笔记(二)——类加载及执行顺序
<Java编程思想>学习笔记(二)--类加载及执行顺序 (这是很久之前写的,保存在印象笔记上,今天写在博客上.) 今天看Java编程思想,看到这样一道代码 //: OrderOfIniti ...
- java中静态代码块,非静态代码块,构造函数
关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...
随机推荐
- Medical image computing
Processing and analysis of medical images using computer comprises the following: image formation an ...
- winston 日志管理4
配置File Transport winston.add(winston.transports.File, options) The File transport should really be t ...
- [GDAL]GEOS和Proj4编译
1.下载源码 geos-3.4.2.tar.bz2 http://trac.osgeo.org/geos/ proj-4.8.0.zip http://trac.osgeo.org/proj ...
- 用仿ActionScript的语法来编写html5——终篇,LegendForHtml5Programming1.0开源库件
一,LegendForHtml5Programming1.0库件是什么?它是一个javascript库,它模仿了ActionScript的语法,用于html5的开发,目前实现的功能相对较少,还不能称之 ...
- tornado中使用Mako模版
tornado是一个优秀的python的开源web 框架,框架本身的性能确实很好,但是他自带的模版只能说是一般般.关于tornado的详细信息可以直接到管网参考. http://www.tornado ...
- 学习jsp(2)
@Webservlet 具体见:http://www.cnblogs.com/luxh/archive/2012/06/06/2537458.html. 我折腾半天才发现,在web.xml里注册了,删 ...
- Leetcode: Remove Elements
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- 转:Selenium之CSS Selector定位详解
CSS selector定位 CSS(Cascading Style Sheets)是一种语言,它被用来描述 HTML 和 XML 文档的样式. 百度输入框: <input name=&quo ...
- PHP内核探索:哈希碰撞攻击是什么?
最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本 ...
- MDX Order排序
Order基础用法: Numeric expression syntaxOrder(Set_Expression, Numeric_Expression [ , { ASC | DESC | BASC ...