类的加载顺序
2016-07-22 02:00
441 查看
类的加载顺序
类的加载顺序,之前一直没有弄明白,今天动手敲了一下代码,验证了类的加载顺序,从而巩固了基础部分的知识首先我们来看如下代码:
public class B { //静态变量 static int i=1; //静态语句块 static { System.out.println("父类1:静态代码块"+i); } //非静态变量 int j=1; //静态语句块 static{ i++; System.out.println("父类2:静态代码块"+i); } //构造函数 public B(){ i++; j++; System.out.println("父类构造函数: "+"i="+i+",j="+j); } //非静态语句块 { i++; j++; System.out.println("父类:非 静态代码块 "+"i="+i+",j="+j); } //非静态方法 public void bDisplay(){ i++; System.out.println("父类:非静态方法 bDisplay(): "+"i="+i+",j="+j); return ; } //静态方法 public static void bTest(){ i++; System.out.println("父类:静态方法 bTest(): "+"i="+i); return ; } }
2.子类继承父类B
public class A extends B{ //静态变量 static int i=1; //静态语句块 static { System.out.println("子类:静态代码块"+i); } //非静态变量 int j=1; //静态语句块 static{ i++; System.out.println("子类:静态代码块"+i); } //构造函数 public A(){ super(); i++; j++; System.out.println("子类构造函数: "+"i="+i+",j="+j); } //非静态语句块 { i++; j++; System.out.println("子类:非静态代码块+"+"i="+i+",j="+j); } //非静态方法 public void aDisplay(){ i++; System.out.println("子类:非静态方法 aDisplay(): "+"i="+i+",j="+j); return ; } //静态方法 public static void aTest(){ i++; System.out.println("子类:静态方法 aTest(): "+"i="+i); return ; } }
public class LoadClass{ public static void main (String args[]) { A a=new A(); a.aDisplay(); } }
3.看看程序运行的结果:
父类1:静态代码块1 父类2:静态代码块2 子类:静态代码块1 子类:静态代码块2 父类:非 静态代码块 i=3,j=2 父类构造函数: i=4,j=3 子类:非静态代码块+i=3,j=2 子类构造函数: i=4,j=3 子类:非静态方法 aDisplay(): i=5,j=3
总结如下,类的加载顺序:
1.无论是父类还是子类,都是先加载静态变量或者静态代码块的。
2.如果是有继承关系,就先加载父类的静态变量或者静态代码块,然后加载子类的静态代码块或者静态变量
3.紧接着,如果实例化子类,第三步骤的加载顺序是,先加载父类的非静态变量或者非静态代码块,然后初始化父类的构造函数。
4.第4步骤是初始化子类的静态代码块或者静态变量之后,然后初始化子类的构造函数。
5.而对于静态方法和非静态方法都是被动调用,即系统不会自动调用执行,所以用户没有调用时都不执行,主要区别在于静态方法可以直接用类名直接调用(实例化对象也可以),而非静态方法只能先实例化对象后才能调用。
总结加载顺序:
父类的静态代码块或者静态变量
子类的静态代码块或者静态变量
父类的非静态代码块或非静态变量
父类的构造函数
子类的非静态代码块 或非静态变量
子类的构造函数
如果有调用则静态方法和非静态方法则进行调用
相关文章推荐
- 由一道面试题来看Java的类加载顺序
- Java类加载机制(初始化顺序)
- java中类的加载顺序
- JAVA中静态块、静态变量加载顺序详解
- JVM类加载机制—加载的顺序问题
- 虚拟机类加载-静态块顺序
- java的父子类加载顺序
- Java中类的加载顺序总结
- 通过代码描述Java类中的各成分加载顺序和内存存放位置
- 类加载顺序(父类,子类,静态)
- WebUploader的java后端上传代码(支持分片上传)(未测试)
- ftp 实现文件的上传下载以及列出文件列表Java代码(未测试)
- 套路重写Java的equals函数
- java中常用的时间处理类TimeUtil
- java lisi乱序、排序
- Java字符串工具类(未测试)
- 算法--列(java实现)
- 统计项目源码行数的Java代码
- java实现鼠标和键盘动作后台监听(未测试)
- 利用Gson实现Json串和Java Bean互转(未测试)