本文章主要是自己在网上学习了别人的文章后写的,其中例子也是直接复制别人的。写着个文章是为了加深记忆,以后忘了也可以翻看下。
java类加载主要有静态static变量、静态初始化块、非静态变量、非静态初始化块和构造方法加载顺序。
加载的顺序如下:
1、同一个类中加载优先级:静态static变量>静态初始化块>非静态变量>非静态初始化块>构造方法。
2、父类和子类加载优先级:
父类静态static变量>父类静态初始化块>子类静态static变量>子类静态初始化块>父类非静态变量>父类非静态初始化块>父类构造方法>子类非静态变量>子类非静态初始化块>子类构造方法
如下是相关例子 ,可以验证上述的结果:
package com.bq.tets.load;
public class Parent
{
public static int t = parentStaticMethod2();
int a = parentStaticMethod3();
//public static int t = 6;
//父类非静态初始化块
{
System.out.println("父类非静态初始化块");
}
//父类静态初始化块
static
{
System.out.println("父类静态初始化块");
}
//父类的构造方法
public Parent()
{
System.out.println("父类的构造方法");
}
//父类类的静态方法
public static int parentStaticMethod()
{
System.out.println("父类类的静态方法");
return 10;
}
//父类的静态方法2
public static int parentStaticMethod2()
{
System.out.println("父类的静态方法2,为了验证static静态变量");
return 9;
}
//父类的静态方法3
public static int parentStaticMethod3()
{
System.out.println("父类的静态方法3,为了验证非静态变量");
return 9;
}
//销毁父类
@Override
protected void finalize() throws Throwable
{
// TODO Auto-generated method stub
super.finalize();
System.out.println("销毁父类");
}
}
package com.bq.tets.load;
public class Child extends Parent
{
public static int m = childStaticMethod2();
int n = childStaticMethod3();
//子类非静态初始化块
{
System.out.println("子类非静态初始化块");
}
//子类静态初始化块
static
{
System.out.println("子类静态初始化块");
}
//子类的构造方法
public Child()
{
System.out.println("子类的构造方法");
}
//子类的静态方法
public static int childStaticMethod()
{
System.out.println("子类的静态方法");
return 1000;
}
//子类的静态方法
public static int childStaticMethod2()
{
System.out.println("子类的静态方法,为了验证静态static变量");
return 1000;
}
//子类的静态方法
public static int childStaticMethod3()
{
System.out.println("子类的静态方法,为了验证非静态变量");
return 1000;
}
//销毁子类
@Override
protected void finalize() throws Throwable
{
// TODO Auto-generated method stub
super.finalize();
System.out.println("销毁子类");
}
}
package com.bq.tets.load;
public class TestLoad
{
public static void main(String[] arg) throws Throwable
{
//Parent.parentStaticMethod();
//int a = Parent.t;
//Parent parent = new Parent();
Child child = new Child();
child.finalize();
}
}