java static 加载顺序_一个例子搞清楚Java类加载顺序

当我们new一个GirlFriend时,我们都做了什么?

一个例子搞懂Java程序运行顺序

public class Girl {

Person person = new Person("Girl");

static{

System.out.println("Girl static");

}

static Person staticPerson = new Person("GirlStaticPerson");

public Girl() {

System.out.println("Girl constructor");

}

public static void main(String[] args) {

new MyGirlFriend();

}

}

class Person{

static{

System.out.println("person static");

}

static Person staticPerson = new Person("PersonStaticPerson");

public Person(String str) {

System.out.println("person "+str);

}

}

class MyGirlFriend extends Girl {

Person person = new Person("MyGirlFriend");

static Person myStaticPerson = new Person("MyStaticPerson");

static{

System.out.println("MyGirlFriend static");

}

public MyGirlFriend() {

System.out.println("MyGirlFriend constructor");

}

}

这段代码同时包含了继承和静态,下面我来仔细分析这段代码的运行结果会是什么。

首先,在执行java Girl之后,jvm会寻找Girl.class,找到之后加载,加载的时候会首先执行静态代码块和静态成员变量(按顺序执行),因此首先执行static{ System.out.println("Girl static"); }

然后初始化静态成员变量,执行这一句:static Person staticPerson = new Person("GirlStaticPerson");,接着会寻找Person类并加载,因此开始执行Person的静态代码块和静态成员变量,即执行这一句:static{ System.out.println("person static"); },接着是静态成员变量:static Person staticPerson = new Person("PersonStaticPerson");此时已经加载了Person类,即开始执行public Person(String str) { System.out.println("person "+str); }方法

接着回到Girl类,Person类已经加载成功,执行person的构造方法并打印person GirlStaticPerson

此时Girl类的静态区域已经执行完,开始执行main方法,即程序主体:new MyGirlFriend();然后寻找MyGirlFriend类并加载,加载后执行静态成员变量:static Person myStaticPerson = new Person("MyStaticPerson");执行Person构造方法打印person MyStaticPerson,然后是静态代码块:static{ System.out.println("MyGirlFriend static"); }

此时MyGirlFriend已经加载完毕,准备执行构造方法,然后发现MyGirlFriend 继承 Girl,需要先执行父类构造方法,执行父类构造方法前又需要初始化父类成员变量,即执行Girl类的Person person = new Person("Girl");该行调用Person的构造方法,打印person Girl,接着才会执行父类构造方法:public Girl() { System.out.println("Girl constructor"); }

父类构造方法执行完之后回到MyGirlFriend类,准备执行子类构造方法,在执行构造方法前需要对其成员变量初始化,也就是执行:Person person = new Person("MyGirlFriend");,最后才是子类构造方法:public MyGirlFriend() { System.out.println("MyGirlFriend constructor"); }

至此,回到main方法,该行代码执行完毕。运行结果是:

Girl static//Girl类静态代码块

person static//Person类静态代码块

person PersonStaticPerson//Person类中的静态Person成员变量

person GirlStaticPerson//Girl类中的静态Person成员变量

person MyStaticPerson//MyGirlFriend类中的静态成员变量

MyGirlFriend static//MyGirlFriend类中的静态代码块

person Girl//Girl类的成员变量

Girl constructor//Girl类的构造方法

person MyGirlFriend//MyGirlFriend类的成员变量

MyGirlFriend constructor//MyGirlFriend构造方法

但是,在当在IDEA里把断点打到这一行时:

ff534fd3725b39d7722997b02c48a1ed.png

偶尔会出现下面的奇怪运行结果:

db7dd6483b7d530c175e06d61101d468.png

个人猜测是idea的debug模式会提前加载类,从而使静态成员变量和静态代码块都提前运行了

总结: 没有女朋友就new一个呀o((>ω< ))o

先静后非,先父后子,先块后器

标签:MyGirlFriend,搞清楚,person,Person,static,new,Java,Girl,加载

来源: https://www.cnblogs.com/lixin-link/p/11069656.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 轻量数据库_DBTree是一个springboot2 + vue-element-template实现的轻量数据库表结构查看及管理工具...

DBTree简介DBTree是一个WEB版的轻量数据库表结构查看及管理工具&#xff0c;相比phpMyAdmin, DBTree只专注于方便开发查看表结构信息和 注释维护。通过树形展示库表结构&#xff0c;可以对表进行自定义归类&#xff0c;在线更新注释。你还可以使用它来部分替代mybatis generato…

java通用异常_Java常用异常整理

填坑&#xff0c;整理下Java的常用异常。正确使用异常在实际编码中非常重要&#xff0c;但面试中的意义相对较小&#xff0c;因为对异常的理解和应用很难通过几句话或几行代码考查出来&#xff0c;不过我们至少应答出三点&#xff1a;异常类的继承关系、常用异常类、常用异常类…

java 移动页面中的图片上传_移动端上传图片(ajax跨域请求)

第一次写项目开发经验&#xff0c;望担待。除了前端以外的事就不叨叨了&#xff0c;下面开始弄干活(两个页面首页、列表页)。项目开发简述项目需求&#xff1a;上传图片并展示。项目地址&#xff1a;项目的链接地址开发工具&#xff1a;sublime后台&#xff1a;java开发语言&am…

php session 反序列化,PHP SESSION反序列化本地样例分析

PHP SESSION反序列化本地样例分析0X00漏洞原因主要原因是&#xff1a; ini_set(‘session.serialize_handler’, ‘php_serialize’);ini_set(‘session.serialize_handler’, ‘php’);两者处理session的方式不同。0X01漏洞分析如果在PHP在反序列化存储的$_SESSION数据时使用的…

php 标题去重复思想,WordPress网站发布文章时如何防止发布重复标题的文章?

事实上&#xff0c;所有插件后端代码都等同于将代码片段添加到functions.php中&#xff0c;functions.php代码片段可以生成插件&#xff0c;然后插件可以自然地集成到functions.php中。插件主要易于管理&#xff0c;但也增加了静态资源请求的数量。如果您知道如何处理这些请求&…

无法连接iphone软件更新服务器_苹果发布了iphone、ipad和mac的新软件更新

苹果已经发布了三种操作系统的软件更新&#xff1a;用于iphone和ipod的iOS、ipad的iPadOS和Macs的macOS。这些更新很小&#xff0c;主要集中在bug修复上&#xff0c;而不是添加新功能。这些更新标记为iOS 13.6.1、iPadOS 13.6.1和macOS 10.15.6补充更新。通常&#xff0c;iOS或…

win10升级助手_关闭win10系统更新

为什么要拒绝更新系统呢&#xff1f;&#xff1f;&#xff1f;1.系统更新占用太多时间2.不合时宜的提醒更新严重影响了工作3.对绝大多数人完全没有必要更新系统微软强奸式的要求更新不合清理。同学们的电脑系统大多数是win10家庭版&#xff0c;可以采用下面方案关闭自动更新&am…

matlab 生成信号文件,生成的代码如何存储内部信号、状态和参数数据

浏览模型示例打开模型示例 rtwdemo_roll。open_system(rtwdemo_roll)该模型包含不连接到根级别 Inport 或 Outport 模块的内部信号。某些信号具有名称&#xff0c;例如 phiCmd 信号。该模型还包含一些维护状态数据的模块。例如&#xff0c;在 BasicRollMode 子系统中&#xff0…

苹果平板怎么卸载软件_怎么很好的卸载流氓软件!

我相信在生活当中&#xff0c;很多人都会在不知情或者不注意的情况下&#xff0c;被迫下载很多自己不想要的软件&#xff0c;而且删除之后总是出现&#xff0c;挥之不去。接下来我将会给大家分享几个下载此类软件的方法&#xff1a;一、通过控制面板卸载点击小图标&#xff0c;…

python 循环语句结果存储_python条件语句和循环语句

一、条件语句Python 条件语句跟其他语言基本一致的&#xff0c;都是通过一条或多条语句的执行结果&#xff08; True 或者 False &#xff09;来决定执行的代码块。 Python 程序语言指定任何非 0 和非空&#xff08;null&#xff09;值为 True&#xff0c;0 或者 null为 False。…

使用c++查看linux服务器某个进程正在使用的内存_精选20个常用的Linux命令

今天总结几个非常常用的Linux命令&#xff0c;其中有几个在面试中很可能问相关命令的原理&#xff0c;比如后台运行命令。希望对大家有所帮助&#xff0c;最好自己去尝试在Linux操作系统中实践一下。1 查看目录以及权限在windows中&#xff0c;使用dir查看当前目录中文件。在Li…

台式电脑可以连wifi吗_不使用WIFI,手机也可以通过电脑的网络上网

让手机通过电脑上网的方式有很多种&#xff0c;最常见的就是 WIFI 了&#xff0c;而且简单直接。但是有时候台式机没有 WIFI &#xff0c;或者电脑的 WIFI 设备已经连接到其他的网络了&#xff0c;这时候手机就不能通过电脑的 WIFI 连接到网络。那么还没有有办法连接到网络呢&a…

pgsql 前10条_未来3年,广州83条城中村、285个旧街区将迎来改造

文、图/羊城晚报全媒体记者 赵燕华 通讯员 穗建未来3年&#xff0c;广州83条城中村将实施改造&#xff0c;285个旧街区将迎来改造&#xff0c;推进176个旧厂房改造&#xff0c;将整治1.24亿平方米违建……9月25日&#xff0c;在广州市深化城市更新工作推进高质量发展政策培训暨…

c++能干什么_「CG原画插画教程」学画画到底能干什么?

原标题&#xff1a;「CG原画插画教程」学画画到底能干什么&#xff1f;艺学绘小编收集整理了学画画到底能干什么&#xff1f;学画画到底能干什么&#xff1f;相信很多学画画的朋友们都被问过这个问题&#xff0c;那些对学画画有偏见的人&#xff0c;总觉得我们在“不务正业”。…

怎样设置电脑壁纸_怎样设置电脑的资料定时备份到移动硬盘里

怎样设置电脑的资料定时备份到移动硬盘里 写回答...安装FreeFileSync即可&#xff0c;功能有&#xff1a;自动备份、单向备份、双向备份、更新指定文件夹、增量更新、定时备份等。你安装后&#xff0c;添加一个批处理任务来执行将电脑的资料定时备份到移动硬盘。选&#xff1a;…

appium自动化测试_Appium自动化测试入门教程No.1—— Appium介绍

(1)特点appium 是一个自动化测试开源工具&#xff0c;支持 iOS 平台和 Android 平台上的原生应用&#xff0c;web应用和混合应用。>>“移动原生应用”是指那些用iOS或者 Android SDK 写的应用(Application简称app)。>>“移动web应用”是指使用移动浏览器访问的应用…

linux 命令行看图片,骚操作:用终端打开图片

导读Linux 上有许多 GUI 图片浏览器。但我尚未听说或使用过任何在终端中显示图片的应用程序。幸运的是&#xff0c;我刚刚发现了一个可用于在终端中显示图像的名叫 FIM 的图像查看器。FIM 引起了我的注意&#xff0c;是因为与大多数 GUI 图片浏览器相比&#xff0c;它非常轻巧。…

linux 登入用户记录,linux记录所有用户登陆及执行过的命令脚本

第一个窗口[roothdss7-4 ~]# echo "historyUSERwhoamiUSER_IPwho -u am i 2>/dev/null| awk {print $NF}|sed -e s/[()]//gif [ "$USER_IP" "" ]; thenUSER_IPhostname ## 获取ip 并且存到变量中fiif [ ! -d /var/log/history ]; thenmkdir /var/…

线程被中断跟被阻塞有什么区别_宠物加盟店跟自营店有什么区别

宠物加盟店跟自营店有什么区别开宠物店是一个很有发展、很有市场前景的项目&#xff0c;特别是在这几年&#xff0c;已经迅猛发展。如果想加入宠物行业&#xff0c;利润、赚钱、前景都不用担心&#xff0c;只要有愿意做成的心&#xff0c;市场大环境不用担心。关于大家提出的宠…

不超过20位的小数正则_意甲身价最贵的20位球星,国米多达7人超过尤文,夺冠成硬任务...

根据《德转网》的最新统计&#xff0c;在本赛季意甲身价排名前20位的球星当中&#xff0c;国际米兰俱乐部拥有多达7人&#xff0c;比起意甲霸主尤文图斯还要多出2人。这7位国米球星分别是卢卡库(意甲球员身价第一&#xff0c;8000万欧元)、马丁内斯(意甲球员身价第四、4000万欧…