JAVA中静态方法,静态代码块,构造方法的输出顺序
今天学习JAVA的时候遇到了一些问题,分不清楚静态方法,静态代码块以及构造方法的调用顺序,写了一个代码帮助我解决了这些问题,如果你也有同样的疑问,不防看看下文。同时,如有错误,欢迎指正!
三者介绍
考虑到读者会有不太清楚静态方法,静态代码块以及构造方法的情况,故下面给出这三者的基本概念以及基本用法。
- 静态方法: 在类的成员方法声明中带有static关键字,则该方法就称为类方法或静态方法。静态方法要通过类名而不是通过实例对象访问。
- 静态代码块: 在一个类中,不属于任何方法体并且以static关键字修饰的语句块,称为静态语句块。静态语句块在加载该类时执行且只执行一次。
- 构造方法: Java中所有类都有构造方法,用来进行该类对象的初始化。
调用顺序
在调用顺序这里,我们可以进行一下区分:
1、静态方法需要被调用才会执行方法中的代码。
2、静态代码块在类被加载时会被调用,且只能被调用一次。
3、构造方法在类被实例化时会被调用。
于是,我们可以很快区分出来静态方法的调用规则与其他的方法没有太大的不同,只是调用时需要用类名调用而不是实例化对象调用。那么,接下来的问题就是静态代码块以及构造方法的顺序了,为了让读者理解的更深刻,再加入父类和子类的关系进行具体说明。
A类的代码
public class StestA {
static{
System.out.println("A类静态代码块");
}
public StestA(){
System.out.println("A的构造方法");
}
}
A类含有静态代码块以及构造方法
B类的代码
public class StestB extends StestA{
static{
System.out.println("B的静态代码块");
}
public StestB() {
System.out.println("B的构造方法");
}
}
B类继承了A类,且含有静态代码块以及构造方法
测试类代码1
public class StestC {
public static void main(String[] args) {
StestA a=new StestA();
System.out.println("分隔");
StestB b=new StestB();
}
先实例化A,再实例化B
输出结果1
A类静态块
A的构造方法
分隔
B的静态代码块
A的构造方法
B的构造方法
从上面的结果可以看出:
1、静态代码块比构造方法更快被调用
2、先调用父类的构造方法,再调用子类的构造方法
我们还要思考一个问题:B类(子类)被实例化的时候A类(父类)的静态代码块会不会输出呢?
##测试类代码2
public class StestC {
public static void main(String[] args) {
StestB b=new StestB();
}
输出结果2
A类静态代码块
B的静态代码块
A的构造方法
B的构造方法
从上面的结果可以看出:
1、静态代码块只能被调用一次。
2、子类实例化的时候会调用父类的静态代码块。
3、先调用静态代码块再调用构造方法。
4、父类比子类更先被调用。
以上便是所有结论。
若有错误,敬请指正。