您的位置:首页 > 编程语言 > Java开发

类的加载顺序

2016-07-22 02:00 441 查看

类的加载顺序

类的加载顺序,之前一直没有弄明白,今天动手敲了一下代码,验证了类的加载顺序,从而巩固了基础部分的知识

首先我们来看如下代码:

public class B {
//静态变量
static int i=1;
//静态语句块
static {
System.out.println("父类1:静态代码块"+i);
}
//非静态变量
int j=1;
//静态语句块
static{
i++;
System.out.println("父类2:静态代码块"+i);
}
//构造函数
public B(){
i++;
j++;
System.out.println("父类构造函数: "+"i="+i+",j="+j);
}
//非静态语句块
{
i++;
j++;
System.out.println("父类:非   静态代码块 "+"i="+i+",j="+j);
}
//非静态方法
public void bDisplay(){
i++;
System.out.println("父类:非静态方法 bDisplay():    "+"i="+i+",j="+j);
return ;
}
//静态方法
public static void bTest(){
i++;
System.out.println("父类:静态方法 bTest():    "+"i="+i);
return ;
}
}


2.子类继承父类B

public class A  extends B{
//静态变量
static int i=1;
//静态语句块
static {
System.out.println("子类:静态代码块"+i);
}
//非静态变量
int j=1;
//静态语句块
static{
i++;
System.out.println("子类:静态代码块"+i);
}
//构造函数
public A(){
super();
i++;
j++;
System.out.println("子类构造函数: "+"i="+i+",j="+j);
}
//非静态语句块
{
i++;
j++;
System.out.println("子类:非静态代码块+"+"i="+i+",j="+j);
}
//非静态方法
public void aDisplay(){
i++;
System.out.println("子类:非静态方法 aDisplay(): "+"i="+i+",j="+j);
return ;
}
//静态方法
public static void aTest(){
i++;
System.out.println("子类:静态方法 aTest():    "+"i="+i);
return ;
}
}


public class LoadClass{
public static void main (String args[]) {
A a=new A();
a.aDisplay();
}
}


3.看看程序运行的结果:

父类1:静态代码块1
父类2:静态代码块2
子类:静态代码块1
子类:静态代码块2
父类:非   静态代码块 i=3,j=2
父类构造函数: i=4,j=3
子类:非静态代码块+i=3,j=2
子类构造函数: i=4,j=3
子类:非静态方法 aDisplay(): i=5,j=3


总结如下,类的加载顺序:

1.无论是父类还是子类,都是先加载静态变量或者静态代码块的。

2.如果是有继承关系,就先加载父类的静态变量或者静态代码块,然后加载子类的静态代码块或者静态变量

3.紧接着,如果实例化子类,第三步骤的加载顺序是,先加载父类的非静态变量或者非静态代码块,然后初始化父类的构造函数。

4.第4步骤是初始化子类的静态代码块或者静态变量之后,然后初始化子类的构造函数。

5.而对于静态方法和非静态方法都是被动调用,即系统不会自动调用执行,所以用户没有调用时都不执行,主要区别在于静态方法可以直接用类名直接调用(实例化对象也可以),而非静态方法只能先实例化对象后才能调用。

总结加载顺序:

父类的静态代码块或者静态变量

子类的静态代码块或者静态变量

父类的非静态代码块或非静态变量

父类的构造函数

子类的非静态代码块 或非静态变量

子类的构造函数

如果有调用则静态方法和非静态方法则进行调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息