java内部类加载顺序_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、静态内部类,只有在第一次调用的时候才会被初始化。**

下一章我们会用今天的代码来学习一下类的加载顺序。

如果文章对您有帮助,请记得点赞关注哟~

欢迎大家关注我的公众号,每日推送技术文章供大家学习参考。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值