类被创建之后的成员的初始化顺序到底是怎么样的?
首先 不考虑继承
package com; public class DemoOne { /** * 关于类的初始化顺序 */ //不考虑继承结构的情况 private static int a=1; private String str="我被赋值了"; static{ //为什么static成员函数不能访问非static变量, 不能调用非static成员函数? //静态代码块独立于对象而存在 不依赖于对象存在 简单来说可以直接以类型名调用DemoOne.a //而成员变量的存在依赖于对象的创建才能被调用 //所以, static成员不能访问非static变量, 不能调用非static成员! // 编译报错 System.out.println("str ===="+ str); System.out.println("1 静态变量被赋初始值 a===="+a); System.out.println("2 进入静态块"); } { System.out.println("3 成员变量被赋值 str ===="+ str); System.out.println("4 进到普通代码块"); }
public void run(){ System.out.println(" 进入普通方法");}public static void go(){ System.out.println(" 进入静态方法");}
public DemoOne(){ System.out.println("5 进入构造器"); } public static void main(String[] args) { new DemoOne(); } }
运行程序后输出结果为:
1 静态变量被赋初始值 a====1
2 进入静态块
3 成员变量被赋值 str ====我被赋值了
4 进到普通代码块
5 进入构造器
为了验证静态成员的顺序由代码的前后顺序决定 加入第二个静态块
package com; public class DemoOne { static{ System.out.println("1 进入第一个静态代码块"); } private static int a; static{ System.out.println("2 进入第二个静态块"); }
public static void main(String[] args) { new DemoOne(); } }
输出结果为:
1 进入第一个静态代码块
2 进入第二个静态块
由输出结果可以看到 调整顺序后的静态块先后顺序发生改变
总结一下 不考虑继承的类的成员加载顺序依次为 静态变量和常量->顺序位的静态块->普通成员变量->普通代码块->构造器
下面考虑存在父类的情况
package com; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class Demo { /** * * @param args */ private static int a=1; private String str="我在父类被赋值了"; static{ System.out.println("1 父类静态变量被赋初始值 a===="+a); System.out.println("2 进入父类静态块"); } { System.out.println("5 父类成员变量被赋值 str ===="+ str); System.out.println("6 进入父类普通代码块"); } public Demo(){ System.out.println("7 进入父类构造器"); } }
子类
package com; public class DemoOne extends Demo{ private static int a=1; private String str="我在子类被赋值了"; static{ System.out.println("3 子类静态变量被赋初始值 a===="+a); System.out.println("4 进入子类静态块"); } { System.out.println("8 子类成员变量被赋值 str ===="+ str); System.out.println("9 进入子类普通代码块"); } public DemoOne(){ System.out.println("10 进入子类构造器"); } public static void main(String[] args) { new DemoOne(); } }
输出结果为:
1 父类静态变量被赋初始值 a====1
2 进入父类静态块
3 子类静态变量被赋初始值 a====1
4 进入子类静态块
5 父类成员变量被赋值 str ====我在父类被赋值了
6 进入父类普通代码块
7 进入父类构造器
8 子类成员变量被赋值 str ====我在子类被赋值了
9 进入子类普通代码块
10 进入子类构造器
所以存在父类的情况下 类成员的初始化顺序
父类静态变量->父类静态块->子类静态变量->子类静态块->父类成员变量->父类普通代码块->父类构造器->子类成员变量->子类普通代码块->子类构造器
还在学习总结过程中,如若有误,请看到的朋友及时指出。
原文地址:https://www.cnblogs.com/tongAngle/p/10128133.html
时间: 2024-10-14 10:37:54