大括号{}的意义与静态代码块与构造函数的加载关系

import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;


import javax.annotation.PostConstruct;


class T {
static {
System.out.println("1");
}


{
System.out.println("2");
}


T() {
System.out.println("父类构造");
}
public static void got(){
System.out.println("调用T类的方法,静态方法");
}
static {
System.out.println("3");
}
{
System.out.println("4");
}
}


public class Test extends T {

public Test() {
System.out.println("子类构造函数");
}
static {
System.out.println("5");
}
{
System.out.println("6");
}


public static void main(String[] args) {

/* Test t = new Test();

t.get();

System.out.println("=====================");
Test.got();
System.out.println("=====================");*/
Test.post();
}

public void get(){
System.out.println("调用Test类的方法");
}

public static void post(){
System.out.println("调用Test类的静态方法");
}
static {
System.out.println("7");
}
{
System.out.println("8");
}
}


new Test()时,输出    1      3                     5    7                         2     4                   父类的构造    6   8                  子类的构造

                              (父类静态代码块)  (子类静态代码块)    (父类初始代码块)                  (子类初始代码块)

调用Test类的内部get方法输出 1 3 5 7 2 4 父类的构造 6 8 子类的构造 调用Test类的方法

Test.got()时输出 1 3 5 7 调用T类的方法,静态方法
Test.post()时输出 1 3 5 7 调用Test类的静态方法

其实在类内部{}只是代表在调用构造函数之前在{}中初始化,static{}只在类加载时调用

new子类的对象时,先调用父类static{}里的东西,再调用子类里的static{},再调用父类{}({}为初始化代码块,在静态块后、构造方法前执行),再调用父类构造方法,再调用子类构造方法


调用子类或者父类的静态方法时,先调用父类的static{}再调用子类的static{}

猜你喜欢

转载自blog.csdn.net/maylead/article/details/78510329