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类加载信息的顺序:包括静态代码快、静态类变量、非静态代码快、构造方法、普通方法的更多相关文章

  1. Java程序员的日常 —— Java类加载中的顺序

    之前说过Java中类的加载顺序,这次看完继承部分,就结合继承再来说说类的加载顺序. 继承的加载顺序 由于static块会在首次加载类的时候执行,因此下面的例子就是用static块来测试类的加载顺序. ...

  2. java类加载时执行顺序

    源代码 class HelloA { public HelloA() { System.out.print("A"); } { System.out.print("B&q ...

  3. 如何在ARC代码中混编非ARC代码

    “ios中如果arc和非arc文件混编,可以在build parses中指定compile flags,如果arc文件设为"-fobjc-arc",非arc文件设为"-f ...

  4. [ios]如何在ARC代码中混编非ARC代码

    参考 :http://blog.sina.com.cn/s/blog_b595ce9e0101nvvn.html “ios中如果arc和非arc文件混编,可以在build parses中指定compi ...

  5. java基础-静态,非静态(构造)代码块,类加载

    static block and non-static block(constructor block) [toc] 想来想去,先来一题比较好 public class Foo { public st ...

  6. java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数

    一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构

  7. Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

    子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A ...

  8. 《Java编程思想》学习笔记(二)——类加载及执行顺序

    <Java编程思想>学习笔记(二)--类加载及执行顺序 (这是很久之前写的,保存在印象笔记上,今天写在博客上.) 今天看Java编程思想,看到这样一道代码 //: OrderOfIniti ...

  9. java中静态代码块,非静态代码块,构造函数

    关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...

随机推荐

  1. nginx源码学习----内存池

    最近在进行监控平台的设计,之前一直觉得C/C++中最棘手的部分是内存的管理上,远不止new/delete.malloc/free这么简单.随着代码量的递增,程序结构复杂度的提高.各种内存方面的问题悄然 ...

  2. python之map、filter、reduce、lambda函数

    map map函数根据提供的函数对指定的序列做映射,定义:map(function, sequence[,sequence,...])--->list 例1 >>> map(l ...

  3. LaunchImage命名与AppIcon命名(ios设置 启动图片和AppIcon图片)

    LaunchImage AppIcon 分别拖拉至Images.scassets  对应的LaunchImage和AppIcon就可以设置 启动图片和AppIcon图片

  4. iOS - (调用系统本机打电话功能)

    如下图所示,点击订单里的打电话 button 后,调用系统的打电话功能. 这个调用系统打电话功能有点简单,不需要遵守协议和代理什么的,直接在点击方法里写上几句代码就可以了. 下面来看看代码吧: 接下来 ...

  5. 针对某个数据库error做systemstate dump

    如果想对某个具体error做systemstate dump收集,可以借助event来实现. 例如想在数据库遇到ora-00054时,收集数据systemstate dump信息: 开启: sqlpl ...

  6. 如何修改DBSNMP和SYSMAN用户的密码

    SYSMAN和DBSNMP用户密码过期后OEM无法使用,并报以下错误: SYSMAN用户的密码被加密后存放在不同的地方,这样database control(OMS和agent)可以不用每次访问数据库 ...

  7. MongoDB分片集群还原

    从mongodb 3.0开始,mongorestore还原的时候,需要一个运行着的实例.早期的版本没有这个要求. 1.为每个分片部署一个复制集 (1)复制集中的每个成员启动一个mongod mongo ...

  8. 随机删除数据库N条记录

    delete from  table where newsID in(select top 50 newsID from  table order by newid())

  9. PostgreSQL与RPM

    如何查看使用PostgreSQL的RPM包安装后的文件目录及相关路径(PostgreSQLRPM的spec文件已经帮我们创建好了postgres用户及postgres组). 查看RPM文档信息:/us ...

  10. 树形DP+RMQ+单调队列(Bob’s Race HDU4123)

    题意:有n个房子,这些房子被n-1条道路连接,有一些运动员从一个房子为起点尽可能跑最远的距离且不能通过一条道路超过两次,这些运行员不能选择同样的起点,这些运动员跑的最远距离和最近距离的差值不能超过Q, ...