Java中一般有会区分静态代码块、构造代码块、构造函数执行顺序
静态代码块依赖于类而生存的, 类加载时候最先执行,只执行一次
构造代码块存在于类之下,依赖于对象而生存,不管是创建有参或者无参构造,每次创建对象时候都会执行,
构造函数与类同名,无返回值,创建对象时候执行,创建对象时,对应参数的构造才会执行
静态代码块、构造代码块、构造函数 执行顺序依次为:
父类静态代码块=》子类静态代码块=》父类构造代码块=》父类构造方法=》子类构造代码块=》子类构造方法
1、无参构造代码如下:
package com.fwl.test;
public class A {
static {
System.out.println("父亲静态块");
}
{
System.out.println("父亲构造块");
}
public A() {
System.out.println("父亲构造方法");
}
public static void main(String[] args) {
new B();
System.out.println("========类已加载,静态块不再执行========");
new B();
}
}
class B extends A {
public B() {
System.out.println(" 子类构造方法");
}
static {
System.out.println(" 子类静态块");
}
{
System.out.println(" 子类构造块");
}
}
输出结构如下:
父亲静态块
子类静态块
父亲构造块
父亲构造方法
子类构造块
子类构造方法
========类已加载,静态块不再执行========
父亲构造块
父亲构造方法
子类构造块
子类构造方法
2、有参构造
public class A {
static {
System.out.println("父亲静态块");
}
{
System.out.println("父亲构造块");
}
public A() {
System.out.println("父亲构造方法");
}
public A(String A) {
System.out.println("父亲有参构造方法");
}
public static void main(String[] args) {
new B("11");
}
}
class B extends A {
// public B() {
// System.out.println(" 子类构造方法");
// }
public B(String B) {
System.out.println(" 子类有参构造方法");
}
static {
System.out.println(" 子类静态块");
}
{
System.out.println(" 子类构造块");
}
}
输出结果如下:
父亲静态块
子类静态块
父亲构造块
父亲构造方法
子类构造块
子类有参构造方法
本次new的对象是子类的有参构造,父类和子类构造块仍然都执行了。子类的有参构造也执行了,而父类的有参构造没有执行,是因为子类中的构造方法前有一句super(),默认继承的是父类的无参构造,所以会这样。若想执行父类有参构造,只需在子类有参构造中,加对应数量参数即可,super(B)。如下:
public class A {
static {
System.out.println("父亲静态块");
}
{
System.out.println("父亲构造块");
}
public A() {
System.out.println("父亲构造方法");
}
public A(String A) {
System.out.println("父亲有参构造方法");
}
public static void main(String[] args) {
new B("11");
}
}
class B extends A {
// public B() {
// System.out.println(" 子类构造方法");
// }
public B(String B) {
super(B);
System.out.println(" 子类有参构造方法");
}
static {
System.out.println(" 子类静态块");
}
{
System.out.println(" 子类构造块");
}
}
输出结果如下:
父亲静态块
子类静态块
父亲构造块
父亲有参构造方法
子类构造块
子类有参构造方法
可以看到父类有参构造也执行了