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内核参数/etc/sysctl.conf sysctl 《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》
优化Linux内核参数/etc/sysctl.conf sysctl <高性能Linux服务器构建实战:运维监控.性能调优与集群应用> http://book.51cto.com/ar ...
- idea 的问题
IDEA的maven项目中,默认源代码目录下的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉. 如果使用的是Eclipse,Eclipse的src目录下的xml等资源 ...
- IntelliJ IDEA 的 Jetty部署插件
jetty相对于tomcat来说,启动速度非常快,方便调试. 在idea的maven项目中,只需要在pom.xml配置文件中配置jetty的插件即可. 全部: <project xmlns=&q ...
- mybatis-spring
现成的中文文档 首先,项目依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifa ...
- H2的MVStore
翻译自http://www.h2database.com/html/mvstore.html 转载请著名出处,及译者信息. 第一次翻译,诸多不妥请谅解,谢谢. 概述 MVStore是一个持久化的.日志 ...
- linux:档案权限
一.例如:-rw-r--r--. 1 root root 129 Dec 29 2013 .tcshrc 详细: 1.-rw-r--r--:档案类型和权限(总共十个栏位) 1.1:第一个栏位代表 ...
- PostgreSQL Replication之第十章 配置Slony(4)
10.4 部署DDLs 对于生产性的应用程序来说,仅仅复制一个表明显是不够的.此外,通过没有办法保证数据从来不会发生改变.在某些时候,部署变化的数据结构(所谓的DDLs)是必要的. 现在的问题是,Sl ...
- windows 计算机 管理 命令
compmgmt.msc
- FAQ: C++中定义类的对象:用new和不用new有何区别?
C++用new创建对象和不用new创建对象的区别解析 作者: 字体:[增加 减小] 类型:转载 时间:2013-07-26 我要评论 在C++用new创建对象和不用new创建对象是有区别的,不知你是否 ...
- Extjs布局
今天我来总结一下extjs下面的各种布局,不仅是为了给自己做笔记,同时,也希望让刚刚接触extjs的朋友们快速的了解下,大神就不用看了.废话不多说,开始布局的讲解. (以下代码都可以直接在javasc ...