JAVA中静态代码块、构造方法、Super()父类与子类之间执行顺序

时间:2023-01-06 19:29:41

PS:今天群里一个小伙伴笔试,匆匆发来的求助信息。。。

JAVA中静态代码块、构造方法、Super()父类与子类之间执行顺序

1.父类、子类之间代码块与构造方法

package com.web.test2;

public class HelloA {
static{
System.out.println("static A");
}

{System.out.println("I'm A class");}

public HelloA(){

System.out.println("HelloA");
}
public HelloA(String s){

System.out.println(s+"HelloA");
}

public static void main(String[] args) {
new HelloB();
}
}
class HelloB extends HelloA{
public HelloB () {
//只能调用一个父类的构造方法
// super();
super("parent");
System.out.println("HelloB");
}
{System.out.println("I'm B class");}
static{
System.out.println("static B");
}


}

执行结果:
static A
static B
I’m A class
parentHelloA
I’m B class
HelloB
总结:代码块于构造方法之前执行,静态于非静态之前,另外,静态代码块只执行一次。


2.父类、子类与super()


public class People {
String name;
public People() {
System.out.println(1);
}
public People(String name) {
System.out.println(2);
this.name = name;
}
}
class Child extends People{
People father;
public Child () {
//super()系统会默认添加的
System.out.println(4);
}
public Child (String name) {
//super()系统会默认添加的
System.out.println(3);
this.name = name;
father = new People(name+":F");
}
public static void main(String[] args) {
new Child("mike");
}
}

故执行结果:132


另外一个难缠的实例:

public class ExA {  
private static ExA a = new ExA();
static {
System.out.println("父类--静态代码块");
}

public ExA() {
System.out.println("父类--构造函数");
}

{
System.out.println("父类--非静态代码块");
}

public static void main(String[] args) {
new ExB();
}
}

class ExB extends ExA {

private static ExB b = new ExB();

static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}

public ExB() {
System.out.println("子类--构造函数");
}
}
  • result as follows :
父类--非静态代码块
父类--构造函数
父类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数
子类--静态代码块
父类--非静态代码块
父类--构造函数
子类--非静态代码块
子类--构造函数