主要探讨java中静态变量(static修饰的常量),静态代码块(static{}包裹),非静态代码块({}包裹),构造方法的调用顺序。
- 静态变量
- 静态代码块
- 非静态代码块
- 构造方法
- 假设无父类静态变量,静态方法,构造方法的调用后的执行过程
- 实际情况静态变量,静态方法,构造方法的调用后的执行过程
- 系统总结
静态常量
public static int key=1
静态代码块
static
{
System.out.println(“父类静态代码块2”);
}
非静态代码块
{
System.out.println(“父类非静态代码块”);
}
构造方法
public parent()
{
System.out.println(“父类非静态构造方法”);
}
1.假设无父类静态变量,静态方法,构造方法的调用后的执行过程
public class parent
{
public static int key = method1();
public static int method1()
{
System.out.println("父类静态方法块1(标记是否初始化静态常量)");
return 2;
}
public static void method2()
{
System.out.println("父类静态方法块2");
}
static {
System.out.println("父类静态代码块1");
}
static {
System.out.println("父类静态代码块2");
}
{
System.out.println("父类非静态代码块");
}
public parent()
{
System.out.println("父类非静态构造方法");
}
}
静态变量
调用 System.out.println(parent.key);
结果是:
父类静态方法块1(标记是否初始化静态常量)
父类静态代码块1
父类静态代码块2
2
调用 parent.method2();
父类静态方法块1(标记是否初始化静态常量)
父类静态代码块1
父类静态代码块2
父类静态方法块2
调用 new parent();
父类静态方法块1(标记是否初始化静态常量)
父类静态代码块 1
父类静态代码块 2
父类非静态代码块
父类非静态构造方法
综上
- 所有涉及类的内容时都会默认初始化静态常量,静态代码块。
- 静态方法调用之前默认加载了静态常量,静态代码块。所以在静态方法中可以使用静态常量
2.实际情况静态变量,静态方法,构造方法的调用后的执行过程
public class child extends parent
{
public static int key = childmethod1();
public static int childmethod1()
{
System.out.println("子类静态方法块1(标记是否初始化静态常量)");
return 1;
}
public static void childmethod2()
{
System.out.println("子类静态方法块2");
}
static {
System.out.println("子类静态代码块1");
}
static {
System.out.println("子类静态代码块2");
}
{
System.out.println("子类非静态代码块");
}
public child()
{
System.out.println("子类非静态构造方法");
}
}
调用System.out.println(child.key);
父类静态方法块1(标记是否初始化静态常量)
父类静态代码块1
父类静态代码块2
子类静态方法块1(标记是否初始化静态常量)
子类静态代码块1
子类静态代码块2
1
调用 child.childmethod2();
父类静态方法块1(标记是否初始化静态常量)
父类静态代码块1
父类静态代码块2
子类静态方法块1(标记是否初始化静态常量)
子类静态代码块1
子类静态代码块2
子类静态方法块2
调用 new child();
父类静态方法块1(标记是否初始化静态常量)
父类静态代码块1
父类静态代码块2
子类静态方法块1(标记是否初始化静态常量)
子类静态代码块1
子类静态代码块2
父类非静态代码块
父类非静态构造方法
子类非静态代码块
子类非静态构造方法
综上 实际中涉及类的调用,首先点用父类的静态变量,静态代码块,然后调用子类的静态变量,静态代码块。
在创建对象时首先一些初始化后调用父类的非静态代码块,父类的构造方法,然后执行子类的静态代码块,子类的构造方法。
系统总结
1.只要涉及这个类,必定会初始化此类及其父类的静态变量及其静态代码块
2.创建对象时会默认调用父类的非静态代码块,构造方法,然后执行子类的非静态代码块及其构造方法。