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 优招面试题_2017华为优招笔试题

哎&#xff0c;没有接到笔试通知&#xff0c;不知道为啥就错过了。之后见到题目&#xff0c;前两道编程题。其实都见过类似的题目&#xff0c;有点思路&#xff0c;但是直接快速完整实现出来&#xff0c;水平还是达不到。这样的题目&#xff0c;也不算难&#xff0c;三道编程题…

java inject例子_java – 手动实例化@InjectMock带注释的字段

我已经浏览了一些博客,以了解Mockito注释如何工作的基础知识.但是,我怀疑何时可以手动实例化用InjectMocks注释的字段,即InjectMocksA a new A();什么时候依靠MockitoAnnotations.initMocks()功能来做同样的事情&#xff1a;InjectMocksA a;这取决于我们用来运行测试用例的Jun…

java 新建 api 案列_Java利用webservice创建接口案例源码

环境要求&#xff1a;JDK1.7&#xff0c;并配置Java的环境变量BaseDao 接口&#xff1a;/*** 要使得成为一个可供访问的接口&#xff0c;必须添加&#xff1a;WebService* */WebServicepublic interface BaseDao {//添加一个加法的接口WebResult(name"addddddre")pu…

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

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

mysql 读取properties_JDBC中使用Properties读取配置文件有什么用

开发中获得连接的4个参数(驱动、URL、用户名、密码)通常都存在配置文件中&#xff0c;方便后期维护&#xff0c;程序如果需要更换数据库&#xff0c;只需要修改配置文件即可。使用properties文件&#xff0c;Java中有专门用来装载配置文件的类Properties(Java.util.Properties)…

java preferences设置_Java利用Preferences设置个人偏好

Preferences的中文意思即偏好或喜好的意思&#xff0c;也就是说同一个程序在每次运行完后&#xff0c;可以通过Preferences来记录用户的偏好&#xff0c;下次启动时&#xff0c;程序会利用这些信息来了解用户的喜好。而这些信息个人理解应该就是存储在系统的注册表中。下面我们…

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

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

java 空包_圆通快递接口,圆通快递礼品商城接口、圆通空包接口,圆通快递低价接口,礼品商城接口、一件代发接口...

更新仓库列表接口地址&#xff1a;http://xxxxxx.com/shop/updates/update-warehouse-list 违心&#xff1a;juzivtu接口介绍:更新发货仓库及发货快递信息请求方式&#xff1a;POST传参方式&#xff1a;JSON返回格式&#xff1a;JSON接口收费&#xff1a;开通一次&#xff0c;…

c和java内存泄漏区别_内存溢出和内存泄漏的区别(转)

1.1内存溢出&#xff1a;(Out Of Memory---OOM)系统已经不能再分配出你所需要的空间&#xff0c;比如你需要100M的空间&#xff0c;系统只剩90M了&#xff0c;这就叫内存溢出例子&#xff1a;一个盘子用尽各种方法只能装4个果子&#xff0c;你装了5个&#xff0c;结果掉倒地上不…

php正则表达式匹配逗号,数字和逗号PHP正则表达式只

我需要创建一个正则表达式验证逗号分隔的数值。数字和逗号PHP正则表达式只他们应该是这样的&#xff1a;1,2,3,4,5等....的值必须是一个数字&#xff0c;如&#xff1a;1点之前或之后没有空的空间&#xff0c;没有逗号之前或之后。或者......多个数值以逗号分隔。第一个和最后一…

java想要生成 字符串,如何在Java中“优雅地”生成String?

我想生成一个字符串,如sql命令&#xff1a;"INSERT INTO xxx VALUES(XXX, XXX, XXX)"目前我使用StringBuilder和一些String常量,如“INSERT INTO”来连接表名和插入值的输入String参数.但是,除了性能问题之外,这种简单的连接看起来并不优雅.有没有其他方法这样做&…

java语言中json转换,JSON字符串和JAVA语言对象的相互转换教程

本文主要向大家介绍了JSON字符串和JAVA语言对象的相互转换教程&#xff0c;通过具体的内容向大家展示&#xff0c;希望对大家学习JAVA语言有所帮助。一&#xff1a;字符串转换为对象:使用JSON.parse()方法var str { "name": "AndrewNeo", "sex"…

php中的数组用什么统计,php数组元素统计与值汇总

array_count_values()array_count_values() 函数用于统计数组中所有值出现的次数。本函数返回一个数组&#xff0c;其元素的键名是原数组的值&#xff0c;键值是该值在原数组中出现的次数。语法 : array_count_values(array)参数描述array必需。规定输入的数组。例子<?php …

10天时间做出php,php 最近10天的所有日期

背景&#xff1a;有时候&#xff0c;比如画曲线图&#xff0c;需要前一天起近10天的日期&#xff0c;你不能获取昨天的时间一天一天减&#xff0c;可别减出20140230&#xff0c;20140231&#xff0c;这就闹笑话了我用下面的笨方法。$date array();for($i10;$i>1;$i--){$dat…

php cgi漏洞,Nginx + PHP CGI的一个可能的安全漏洞

现在普遍的Nginx PHP cgi的做法是在配置文件中, 通过正则匹配Nginx(PHP/fastcgi的PATH_INFO问题,设置SCRIPT_FILENAME, 今天发现了一个这种方式的安全漏洞.为什么会这样呢?比如, 如下的nginx conf:location ~ .php($|/) {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.p…

java开发怎么优化代码,代码优化,该如何处理

当前位置:我的异常网 Java Web开发 代码优化,该如何处理代码优化,该如何处理www.myexceptions.net 网友分享于&#xff1a;2014-08-19 浏览&#xff1a;0次代码优化public String Txt() throws ParseException {re (HttpServletRequest) ActionContext.getContext().get(S…

kali2.0安装mysql,Ubuntu/kali上安装MySQL,设置远程访问详细教程

搜索热词Ubuntu上安装MysqL非常简单只需要几条命令就可以完成。1. sudo apt-get install MysqL-server2. apt-get installMysqL-client (可选)3. sudo apt-get install libMysqLclient-dev(可选)安装过程中会提示设置密码什么的&#xff0c;注意设置了不要忘了&#xff0c;安装…

php数组在golang,go语言数据类型-数组(array)

数组是Go语言编程中最常用的数据结构之一。顾名思义&#xff0c;数组就是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element)&#xff0c;一个数组包含的元素个数被称为数组的长度。在Go语言中数组是一个值类型(value type)。是真真实实的数组&#xff…

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数据时使用的…