先说结论。
对象创建时代码的加载顺序为:静态代码-->非静态代码-->构造方法。
若继承了父类,则加载顺序为:父类的静态的代码-->子类的静态的代码-->父类内部非静态代码-->父类的构造方法-->子类的非静态代码-->子类的构造方法。
其中,静态代码包括(静态方法,静态变量,静态代码块等),非静态代码即(成员方法,成员变量,成员代码块等),同一种代码,写在上面的先加载。
为了研究对象加载时候,静态代码块,静态变量,构造方法,成员方法等各个代码的加载顺序,进行如下测试:
测试一:
package test;
public class java父类及子类代码的加载顺序 {
public static void main(String[] args) {
Parent parent =new Parent();
}
}
class Parent{
static{
System.out.println("父类静态代码块1");
}
static String tem=aa();
static String aa(){
System.out.println("父类的静态方法");
return "";
}
public Parent(){
System.out.println("父类的构造方法");
}
static{
System.out.println("父类静态代码块2");
}
{
System.out.println("父类非静态代码块1");
}
String temp = tt();
String tt(){
System.out.println("父类的成员方法");
return "成员方法";
}
{
System.out.println("父类非静态代码块2");
}
}
运行结果为:
父类静态代码块1
父类的静态方法
父类静态代码块2
父类非静态代码块1
父类的成员方法
父类非静态代码块2
父类的构造方法
因此可以得到结论:
对象加载时代码的加载顺序为:静态代码-->非静态代码-->构造方法。
测试二:
package test;
public class java父类及子类代码的加载顺序 {
public static void main(String[] args) {
Childern childern =new Childern();
}
}
class Parent{
static{
System.out.println("父类静态代码块1");
}
static String tem=aa();
static String aa(){
System.out.println("父类的静态方法");
return "";
}
public Parent(){
System.out.println("父类的构造方法");
}
static{
System.out.println("父类静态代码块2");
}
{
System.out.println("父类非静态代码块1");
}
String temp = tt();
String tt(){
System.out.println("父类的成员方法");
return "成员方法";
}
{
System.out.println("父类非静态代码块2");
}
}
class Childern extends Parent{
static{
System.out.println("子类静态代码块1");
}
static String tem=aa();
static String aa(){
System.out.println("子类的静态方法");
return "";
}
public Childern(){
System.out.println("子类的构造方法");
}
static{
System.out.println("子类静态代码块2");
}
{
System.out.println("子类非静态代码块1");
}
String temp = TT();
String TT(){
System.out.println("子类的成员方法");
return "成员方法";
}
{
System.out.println("子类非静态代码块2");
}
}
测试结果:
父类静态代码块1
父类的静态方法
父类静态代码块2
子类静态代码块1
子类的静态方法
子类静态代码块2
父类非静态代码块1
父类的成员方法
父类非静态代码块2
父类的构造方法
子类非静态代码块1
子类的成员方法
子类非静态代码块2
子类的构造方法
可以得出结论:对象在加载时,若继承了父类。加载顺序为:父类的静态的代码-->子类的静态的代码-->父类内部非静态代码-->父类的构造方法-->子类的非静态代码-->子类的构造方法。