为了叙述方便,我写了个小例子

class Three{

private static int s3 = getS3();

private int y = getY();

public Three(){

System.out.println("Three created and  y = "+y);

}

public int getY(){

System.out.println("Three class getY");

return 12;

}

public static int getS3(){

System.out.println("Three class getS3");

return 44;

}

}

class Two extends Three{

private static int s2 = getS2();

private int x = getX();

public Two() {

System.out.println("Two created and  x = "+x);

}

public int getX(){

System.out.println("Two class getX");

return 11;

}

public static int getS2(){

System.out.println("Two class getS2");

return 44;

}

}

public class One extends Two{

private static int s1 = getS1();

private int z = getZ();

public One(){

System.out.println("One created and  z = "+z);

}

/**

* @param args

*/

public static void main(String[] args) {

One one = new One();

}

public int getZ(){

System.out.println("One class getZ");

return 11;

}

public static int getS1(){

System.out.println("One class getS1");

return 45;

}

}

运行结果:

Three class getS3

Two class getS2

One class getS1

Three class getY

Three created and  y = 12

Two class getX

Two created and  x = 11

One class getZ

One created and  z = 11

解析(为了简便,省略掉所有类的根基类Object):

1.加载类

Java程序运行是从一个静态main()方法开始,此例中也就是 One.main(),当试图调用main方法时,加载器首先需要先加载One的编译代码,也就是One.class文件,加载过程中编译器,会检查是否有基类,如果有基类则继续加载基类,如果该基类还有自身的基类,则第二个基类会被加载,如此类推.上面程序中,先加载One.class,然后Two.class,然后Three.class.

2.静态初始化(静态变量的初始化)

从根基类开始,静态初始化会被执行,然后是下一个导出类的静态初始化,如此类推.上例中根基类Three的静态变量是s3,初始化调用getS3()方法,因此打印 "Three class getS3" ,

接着是导出类Two的静态变量s2的初始化,初始化调用getS2()方法,因此打印 " Two class getS2 " ,然后是导出类One的静态变量s1的初始化,初始化调用getS1()方法,因此打印

"One class getS1 ".

3.在内存堆上分配分配足够的存储空间,创建对象

对象中所有的基本类型都是默认值,对象引用设为null----通过将对象内存设置为二进制0值

4.构造方法的调用

跟静态初始化顺序一样,首先调用基类构造器,调用构造器需要执行两步操作,1.按声明顺序调用成员初始化方法 2.执行构造方法里包含的代码.

上例中,首先从基类Three开始,1. 初始化成员变量y,调用getY(),因此打印" Three class getY ",2.执行构造方法里包含的 代码,因此打印" Three created and  y = 12 " ,接着是导出类Two,执行相同操作,最后是导出类One,执行相同操作

class Super{

int i=10;

Super(){

print();

i=20;

}

void print(){

System.out.print(i);

}

}

public class Sub{

int j=30;

Sub(){

print();

j=40;

}

void print(){

System.out.print(j);

}

public static void main(){

System.out,.print(new SUb().j);

}

}

结果是03040

java 启动加载顺序_Java 程序的加载运行过程 | 学步园相关推荐

  1. java枚举加载顺序_java 中类的加载顺序(转)

    1.虚拟机在首次加载Java类时,会对静态初始化块.静态成员变量.静态方法进行一次初始化 2.只有在调用new方法时才会创建类的实例 3.类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始 ...

  2. 文件加载顺序_Java中类的加载顺序介绍(ClassLoader)

    Java中类的加载顺序介绍(ClassLoader) 1.ClassNotFoundExcetpion 我们在开发中,经常可以遇见java.lang.ClassNotFoundExcetpion这个异 ...

  3. java静态方法加载顺序_java中类以及方法的加载顺序

    先看下面的代码: public class Test { public static int a =0 ; static { a = 10; System.out.println("静态代码 ...

  4. 加载顺序_Java的web.xml组件加载顺序

    在配置项目组件的过程中, 了解Tomcat加载组件顺序很有必要. 例如某些框架如Quartz的集群功能需要数据库的支持, 数据库的加载肯定要在框架组件加载之前. 经过查阅和Debug发现, web.x ...

  5. 加载顺序_JAVA类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了!...

    类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了! 我们知道在一个类中,类的加载顺序为 静态代码块-->普通代码块-->构造代码块,感觉静态块始终是最先初始化的,其实并不是,下面 ...

  6. java简述对象的组合_Java程序运行和对象创建过程简述

    Java中一个对象创建分为两个步骤: 加载类,创建对象. 加载类是将所写的程序.java文件编译生成的.class文件加载到内存中,保证了对象创建的预置环境.类加载完毕后才可以创建该类的对象. 第一步 ...

  7. java 类 加载 初始化_java类的加载与初始化

    https://blog.csdn.net/u013349237/article/details/71076617 1在命令行启动虚拟机jvm进行加载, 2用class.forname()方法进行动态 ...

  8. java项目包创建顺序_java程序初始化的顺序

    来自:http://blog.csdn.net/socoolfj/article/details/750425   http://www.cnblogs.com/miniwiki/archive/20 ...

  9. java 获得 加载类_java 类的加载,与获得相应的方法

    package com.yxy.core; import java.lang.reflect.Method; import java.lang.reflect.Type; import static ...

最新文章

  1. 【新无人机数据集】从 行人重识别 到 无人机目标定位
  2. 科学计算机程序 字表处理软件都是,计算机应用基础知识_计算机应用基础试题及答案【最新资料】.doc...
  3. 全新版本仿网易云音乐来啦
  4. 人工智能 | 人工智能的发展历程
  5. python语言程序设计慕课_中国大学MOOC(慕课)_Python语言程序设计基础_试题及答案...
  6. VTK:IO之ReadImageData
  7. jumpserver 堡垒机环境搭建(图文详解)
  8. 专业App开发:设计App图标的三个关键点
  9. ASP.NET页面与IIS底层交互和工作原理详解 (二)
  10. 了解java虚拟机—非堆相关参数设置(4)
  11. html制作炸金花,如何在微信小程序上制作炸金花?
  12. 数据集_FashionMNIST 数据集
  13. 网通修改了偶的ADSL登录密码
  14. 自动驾驶笔记-轨迹跟踪-综述
  15. 单纯形法的代码实现与退化算例
  16. Spark优化——推测执行机制
  17. python代码螺旋线怎么写_用Python绘制三轴对数螺旋线
  18. html5手机网站需要加的那些meta标签,手机网站自适应
  19. dw实时视图与网页不一样_视图窗口和oc实时预览内容显示范围不一样,不完全同步。...
  20. 集体过冬,Hyper-V为企业省钱

热门文章

  1. 单链表-逆置单链表(修改指针指向且三个指针)
  2. 三个优秀的语义分割框架 PyTorch实现
  3. OpenCV java 图像基本处理-模糊 (8)
  4. 创建maven工程的时候settings.xml 几个配置的文件
  5. day9 线程与进程、队列
  6. OpenCV 中的 Scalar 类、Vec类
  7. IDentif.AI | 开发AI平台以快速确定包括COVID-19在内感染的治疗方案
  8. 文件bookDetails.html,查看源码: BookShopping.rar_bookdetails.jsp - VerySource
  9. html5 上传超大文件,HTML5教程 如何拖拽上传大文件
  10. linux 查进程对应用户,linux进程状态查询