java 中类的加载顺序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gao1440156051/article/details/70262259


JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的;

静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。

先初始化父类的静态代码--->初始化子类的静态代码-->
初始化父类的非静态代码--->初始化父类构造函数--->
初始化子类非静态代码--->初始化子类构造函数


看一段代码

package test;

class Parent
{
    public static int t = parentStaticMethod2();
    {
        System.out.println("父类非静态初始化块");
    }
    static
    {
        System.out.println("父类静态初始化块");
    }
    public Parent()
    {
        System.out.println("父类的构造方法");
    }
    public static int parentStaticMethod()
    {
        System.out.println("父类类的静态方法");
        return 10;
    }
    public static int parentStaticMethod2()
    {
        System.out.println("父类的静态方法2");
        return 9;
    }
  
    @Override
    protected void finalize() throws Throwable
    {
        // TODO Auto-generated method stub
        super.finalize();
        System.out.println("销毁父类");
    }
    
}

class Child extends Parent
{
    {
        System.out.println("子类非静态初始化块");
    }
    static
    {
        System.out.println("子类静态初始化块");
    }
    public Child()
    {
        System.out.println("子类的构造方法");
    }
    public static int childStaticMethod()
    {
        System.out.println("子类的静态方法");
        return 1000;
    }
    @Override
    protected void finalize() throws Throwable
    {
        // TODO Auto-generated method stub
        super.finalize();
        System.out.println("销毁子类");
    }
}


public class Test{
	public static void main(String[] args) {
		Parent p=new Parent(); //1
//		Parent.parentStaticMethod();  //2
//		Child c=new Child();  //3
	}
}

1.只运行main里第1行代码结果:

父类的静态方法2
父类静态初始化块
父类非静态初始化块
父类的构造方法

2.只运行main里第2行代码结果:

父类的静态方法2
父类静态初始化块
父类类的静态方法

3.只运行main里第3行代码结果:

父类的静态方法2
父类静态初始化块
子类静态初始化块
父类非静态初始化块
父类的构造方法
子类非静态初始化块
子类的构造方法






猜你喜欢

转载自blog.csdn.net/gao1440156051/article/details/70262259