java 启动加载顺序_Java 程序的加载运行过程 | 学步园
为了叙述方便,我写了个小例子
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 程序的加载运行过程 | 学步园相关推荐
- java枚举加载顺序_java 中类的加载顺序(转)
1.虚拟机在首次加载Java类时,会对静态初始化块.静态成员变量.静态方法进行一次初始化 2.只有在调用new方法时才会创建类的实例 3.类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始 ...
- 文件加载顺序_Java中类的加载顺序介绍(ClassLoader)
Java中类的加载顺序介绍(ClassLoader) 1.ClassNotFoundExcetpion 我们在开发中,经常可以遇见java.lang.ClassNotFoundExcetpion这个异 ...
- java静态方法加载顺序_java中类以及方法的加载顺序
先看下面的代码: public class Test { public static int a =0 ; static { a = 10; System.out.println("静态代码 ...
- 加载顺序_Java的web.xml组件加载顺序
在配置项目组件的过程中, 了解Tomcat加载组件顺序很有必要. 例如某些框架如Quartz的集群功能需要数据库的支持, 数据库的加载肯定要在框架组件加载之前. 经过查阅和Debug发现, web.x ...
- 加载顺序_JAVA类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了!...
类代码块和属性的加载顺序问题,不要以为静态块始终最先执行了! 我们知道在一个类中,类的加载顺序为 静态代码块-->普通代码块-->构造代码块,感觉静态块始终是最先初始化的,其实并不是,下面 ...
- java简述对象的组合_Java程序运行和对象创建过程简述
Java中一个对象创建分为两个步骤: 加载类,创建对象. 加载类是将所写的程序.java文件编译生成的.class文件加载到内存中,保证了对象创建的预置环境.类加载完毕后才可以创建该类的对象. 第一步 ...
- java 类 加载 初始化_java类的加载与初始化
https://blog.csdn.net/u013349237/article/details/71076617 1在命令行启动虚拟机jvm进行加载, 2用class.forname()方法进行动态 ...
- java项目包创建顺序_java程序初始化的顺序
来自:http://blog.csdn.net/socoolfj/article/details/750425 http://www.cnblogs.com/miniwiki/archive/20 ...
- java 获得 加载类_java 类的加载,与获得相应的方法
package com.yxy.core; import java.lang.reflect.Method; import java.lang.reflect.Type; import static ...
最新文章
- 【新无人机数据集】从 行人重识别 到 无人机目标定位
- 科学计算机程序 字表处理软件都是,计算机应用基础知识_计算机应用基础试题及答案【最新资料】.doc...
- 全新版本仿网易云音乐来啦
- 人工智能 | 人工智能的发展历程
- python语言程序设计慕课_中国大学MOOC(慕课)_Python语言程序设计基础_试题及答案...
- VTK:IO之ReadImageData
- jumpserver 堡垒机环境搭建(图文详解)
- 专业App开发:设计App图标的三个关键点
- ASP.NET页面与IIS底层交互和工作原理详解 (二)
- 了解java虚拟机—非堆相关参数设置(4)
- html制作炸金花,如何在微信小程序上制作炸金花?
- 数据集_FashionMNIST 数据集
- 网通修改了偶的ADSL登录密码
- 自动驾驶笔记-轨迹跟踪-综述
- 单纯形法的代码实现与退化算例
- Spark优化——推测执行机制
- python代码螺旋线怎么写_用Python绘制三轴对数螺旋线
- html5手机网站需要加的那些meta标签,手机网站自适应
- dw实时视图与网页不一样_视图窗口和oc实时预览内容显示范围不一样,不完全同步。...
- 集体过冬,Hyper-V为企业省钱
热门文章
- 单链表-逆置单链表(修改指针指向且三个指针)
- 三个优秀的语义分割框架 PyTorch实现
- OpenCV java 图像基本处理-模糊 (8)
- 创建maven工程的时候settings.xml 几个配置的文件
- day9 线程与进程、队列
- OpenCV 中的 Scalar 类、Vec类
- IDentif.AI | 开发AI平台以快速确定包括COVID-19在内感染的治疗方案
- 文件bookDetails.html,查看源码: BookShopping.rar_bookdetails.jsp - VerySource
- html5 上传超大文件,HTML5教程 如何拖拽上传大文件
- linux 查进程对应用户,linux进程状态查询