java类对象的初始化顺序
在下面这个例子中,我们分别在父类和子类中测试了静态代码块、普通代码块、静态成员变量、普通成员变量、构造器、静态内部类。
一:代码块及变量测试
class Field{
public static String baseFieldInit(){
System.out.println("父类全局变量");
return "";
}
public static String baseStaticFieldInit(){
System.out.println("父类静态变量");
return "";
}
public static String fieldInit(){
System.out.println("子类全局变量");
return "";
}
public static String staticFieldInit(){
System.out.println("子类静态变量");
return "";
}
}
class Father{
static {
System.out.println("父类静态代码块1");
}
private static String staticValue = Field.baseStaticFieldInit();
static {
System.out.println("父类静态代码块2");
}
{
System.out.println("父类构造代码块1");
}
private String value = Field.baseFieldInit();
{
System.out.println("父类构造代码块2");
}
Father(){
System.out.println("父类构造器");
}
}
public class Children extends Father {
static {
System.out.println("子类静态代码块1");
}
private static String staticValue = Field.staticFieldInit();
static {
System.out.println("子类静态代码块2");
}
{
System.out.println("子类构造代码块1");
}
private String value = Field.fieldInit();
{
System.out.println("子类构造代码块2");
}
public Children(){
System.out.println("子类无参构造器");
}
private static class House{
private static Children houseColor = new Children();
}
/**
* 测试类
*/
public static void main(String[] args) {
Children children = new Children();
System.out.println("Children:"+children);
System.out.println("*******************************");
// 第二遍
Children children1 = new Children();
System.out.println("Children:"+children1);
System.out.println("*******************************");
}
}
二:测试结果
父类静态代码块1
父类静态变量
父类静态代码块2
子类静态代码块1
子类静态变量
子类静态代码块2
父类构造代码块1
父类全局变量
父类构造代码块2
父类构造器
子类构造代码块1
子类全局变量
子类构造代码块2
子类无参构造器
Children:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
父类构造代码块1
父类全局变量
父类构造代码块2
父类构造器
子类构造代码块1
子类全局变量
子类构造代码块2
子类无参构造器
Children:com.zhixie.jvmclassload.demo.Children@1be6f5c3
*******************************
三:测试静态内部类
public static void main(String[] args) {
Children chouse = House.houseColor;
System.out.println("ChildrenHouse:"+chouse);
System.out.println("*******************************");
Children chouse1 = House.houseColor;
System.out.println("ChildrenHouse:"+chouse1);
System.out.println("*******************************");
}
父类静态代码块1
父类静态变量
父类静态代码块2
子类静态代码块1
子类静态变量
子类静态代码块2
父类构造代码块1
父类全局变量
父类构造代码块2
父类构造器
子类构造代码块1
子类全局变量
子类构造代码块2
子类无参构造器
ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
四:总结
经过我们反复调整顺序进行测试后,可得出如下结论:
1、静态代码块、静态成员变量只有第一次加载类时才会执行。
2、执行顺序为:父类静态代码块及父类静态成员变量(并列优先级)--->子类静态代码块及子类静态成员变量(并列优先级)--->父类普通代码块及父类成员变量--->父类构造器--->子类普通代码块及子类成员变量--->子类构造器。
3、静态内部类,只有在第一次调用的时候才会被初始化。
下一章我们会用今天的代码来学习一下类的加载顺序。
如果文章对您有帮助,请记得点赞关注哟~
欢迎大家关注我的公众号<情系IT>,每日技术推送文章供大家学习参考。
java类对象的初始化顺序的更多相关文章
- java类的成员初始化顺序和初始化块知识
java类的成员初始化顺序和初始化块知识 转自:http://blog.csdn.net/lgfeng218/article/details/7606735 属性.方法.构造方法和自由块都是类中的成员 ...
- Java 类成员的初始化顺序
Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究. 1 无继承情况下的Jav ...
- Java类的成员初始化顺序
Java类的成员初始化顺序 2017-06-01 代码: public class InitializeSequence { public static void main(String[] args ...
- Java类的变量初始化顺序
大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台 ...
- C++ 类对象的初始化顺序 ZZ
C++构造函数调用顺序 1. 创建派生类的对象,基类的构造函数优先被调用(也优先于派生类里的成员类): 2. 如果类里面有成员类,成员类的构造函数优先被调用:(也优先于该类本身的构造函数 ...
- java类中元素初始化顺序
结论:对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器. public class Test4 { @Tes ...
- java类及实例初始化顺序
1.静态变量.静态代码块初始化顺序级别一致,谁在前,就先初始化谁.从上而下初始化(只在类加载时,初始化一次) 2.非静态变量.非静态代码块初始化顺序级别一致,谁在前,就先初始化谁.从上而下初始化(只要 ...
- Java 类的成员初始化顺序
做个简单笔录,就当是重温下基础知识. 1.先看代码: package com.test; public class Test { public static void main(String[] ar ...
- java类中元素初始化顺序详解
父类静态变量父类静态块子类静态变量子类静态块父类普通变量父类普通块父类构造方法子类普通变量子类普通块子类构造方法
随机推荐
- Hadoop 之 MapReduce原理
1.什么是MapReduce 答:简而言之,就是将一个大任务分成多个小的子任务(Map),并行执行后,合并结果(Reduce).下面举一个纸牌得栗子 2.MapReduce的运行流程 3.JobT ...
- Hadoop 之 HDFS基本概念
1.HDFS的基本概念 答:块(Block).NameNode.DataNode.HDFS的文件被分成块进行存储,默认块的大小为64M,所以说块是文件存储和处理的逻辑单元.NameNode是管理节点, ...
- APP自動化測試腳本3
package com.lemon.day01; import java.net.MalformedURLException; import java.net.URL; import java.uti ...
- jenkins自动化部署项目1--下载安装启动(linux)
前面是在windows上搭建jenkins环境,最近有同事要我帮忙在linux上搭建一套,因此在此记录下过程. 因为jenkins.msi只能在windows上运行安装,因此在linux上安装jenk ...
- Windows认证 | Windows本地认证
Windows的登陆密码是储存在系统本地的SAM文件中的,在登陆Windows的时候,系统会将用户输入的密码与SAM文件中的密码进行对比,如果相同,则认证成功. SAM文件是位于%SystemRoot ...
- jstl.jar下载地址
下载地址: 链接:https://pan.baidu.com/s/15_B1QLelWOvTGdC7BoAp4A 密码:vmdr
- Python学习笔记整理总结【MySQL】
一. 数据库介绍 1.什么是数据库?数据库(Database)是按照数据结构来组织.存储和管理数据的仓库.每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将 ...
- 【SQL server初级】数据库性能优化二:数据库表优化
数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第二部分 数据库性能优化二:数据库表优化 优化①:设计规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询 ...
- SpringBootSecurity学习(20)前后端分离版之OAuth2.0刷新token
刷新token 前面的例子和配置都是从头开始申请授权码和令牌,现在来看一下如何根据获取令牌时,回参中的 refresh_token 来刷新令牌.现在在项目中配置的是内存模式的默认用户名密码,第一步先改 ...
- github项目上传管理
一.完成项目后再在github上面新建仓库然后上传代码文件 1.创建仓库时不初始化README.md文件 touch README.md //此行可忽略 git init //初始化仓库 git ad ...