在下面这个例子中,我们分别在父类和子类中测试了静态代码块、普通代码块、静态成员变量、普通成员变量、构造器、静态内部类

一:代码块及变量测试

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>,每日技术推送文章供大家学习参考。

最新文章

  1. C#:Md5和Sha1两种加密方式
  2. winform listview控件
  3. [洛谷OJ] P1114 “非常男女”计划
  4. 统计查询-sql
  5. hibernate---ID生成策略
  6. oracle学习 一 (持续更新中)
  7. MySql中的事务嵌套
  8. ios7开发者必知
  9. Advanced Sort Algorithms
  10. HTML5网站大观:15个精美的 HTML5 单页网站作品欣赏
  11. Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法
  12. Windows Azure Storage (25) Azure Append Blob
  13. NOIP2016 天天爱跑步 80分暴力
  14. javascript中的typeof和类型判断
  15. 搭建ES6开发环境
  16. ASCII,Unicode 和 UTF-8
  17. U盘安装ubuntu 16.04 遇到 gfxboot.c32:not a COM32R image boot 的解决方法
  18. In-App Purchase iap 内付费 二次验证代码 (java 服务器端)
  19. JS操作MongoDB
  20. JQuery $.each遍历JSON字符串报Uncaught TypeError:Cannot use &#39;in&#39; operator to search for

热门文章

  1. Chrome 查看产品原型图
  2. 2018年蓝桥杯ava b组第一题
  3. 暑期——第八周总结(1,安装好hadoop之后访问http://localhost:50070,无法连接【已解决】 2,Hbase命令详解)
  4. Postman 之 HTTP Multipart/form-data 调试
  5. 深入理解perf报告中的swapper进程
  6. SpringBoot -&gt; @Import使用
  7. String 用法 简单API
  8. 离线服务器安装zabbix
  9. Spring 中使用 @Scheduled 创建定时任务
  10. MySQL 复制已存在的表生成新表