废话不多说,直接上代码
父类
package t1;
public class Father {
static {
System.out.println("Father: 静态块");
}
static public void fun() {
System.out.println("fun");
}
{
System.out.println("Father: 代码块 ");
}
public Father() {
System.out.println("Father: 构造方法");
}
public void print() {
System.out.println("Father: print方法");
}
}
子类
package t1;
public class Son extends Father{
static {
System.out.println("Son: 静态块");
}
{
System.out.println("Son: 代码块");
}
public Son() {
System.out.println("Son: 构造方法");
}
@Override
public void print() {
System.out.println("Son: print方法");
}
}
测试
package t1;
public class Test {
public static void main(String[] args) {
Father son = new Son();
System.out.println("------------------------------------");
Father son2 = new Son();
}
}
结果
Father: 静态块
Son: 静态块
Father: 代码块
Father: 构造方法
Son: 代码块
Son: 构造方法
------------------------------------
Father: 代码块
Father: 构造方法
Son: 代码块
Son: 构造方法
结论
1.类中所有属性的默认值(一举而成)
2. 父类静态属性初始化,静态块,静态方法的声明(按出现顺序执行)
3. 子类静态属性初始化,静态块,静态方法的声明 (按出现顺序执行)
4. 调用父类的构造方法,
首先父类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)
然后父类构造方法
5. 调用子类的构造方法,
首先子类的非静态成员初始化,构造块,普通方法的声明(按出现顺序执行)
然后子类构造方法
参考了这篇博客
附赠阿里巴巴面试题
public class Text {
public static int k = 0;
public static Text t1 = new Text("t1");
public static Text t2 = new Text("t2");
public static int i = print("i");
public static int n = 99;
public int j = print("j");
{
print("构造块");
}
static {
print("静态块");
}
public Text(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String args[]) {
Text t = new Text("init");
}
}