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.执行优先级高于非静态的初始化块,它会 ...
随机推荐
- Linux绑定双网卡
Linux绑定双网卡 1. 配置参数文件 版本在centos6以下在/etc/modproe.conf文件中配置,版本是centos6.x或以上在/etc/modproe.d/目录下配置. 2. ...
- asp.net 项目在 IE 11 下出现 “__doPostBack”未定义 的解决办法
最近项目在 IE 11 下<asp:LinkButton> 点击出现 “__doPostBack”未定义”,经过一番google,终于知道了原因:ASP.NET 可能无法辨识出一些浏览器的 ...
- Login failed知多少
说起Login failed我们首先会想起密码错误,但密码错误只是众多login failed中的一个,本篇将罗列各类login failed在ERRORLOG中的表现,以及如何提取这类错误信息.通过 ...
- 查找文件并执行的shell命令
来由 经常我们需要找到某类文件, 并对进行处理. 例如找到.svn文件夹, 然后删除掉. 如果不使用shell,你可以选择手动删除, 前提是没有几个此类文件, 但是svn信息文件很多, 不能采用手动删 ...
- mysql explain输出中type的取值说明
原文: http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html 这列很重要,显示了连接使用了哪种连接类别,有无使用索引. 从最好 ...
- [翻译] java NIO 教程---介绍
原文地址:http://tutorials.jenkov.com/java-nio/index.html Java NIO(new IO)是从java1.4之后的对IO API的另一种选择,即对标准j ...
- Lintcode: Minimum Adjustment Cost
Given an integer array, adjust each integers so that the difference of every adjcent integers are no ...
- for 穷举、迭代 while循环
1.穷举: 把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况. 2.百鸡百钱:公鸡2文钱一只,母鸡1文钱一只,小鸡半文钱一只,总共只有100文钱,如何在凑够100只鸡的情况下刚好花完100 ...
- FOJ 2013 11 月赛
这套题目还是比较吊的,由于我的沙茶,还是很多没有做出来- -! C:逆序数 D:呵呵 A:妈蛋,自己精度没弄好,想到之前GCC的要加eps,就WA了几次后交Visual C++过了!C(n,m)p^m ...
- Python学习总结7:随机字符串和随机数
Python生成随机数与随机字符串,需要import random模块.random模块最常用的几个函数如下: 1. random.random(a, b) 用于生成一个0到1的随机符点数: 0 &l ...