package com.bdqn.overload;
class X extends T {
static {
System.out.println("t静态代码块4");
}
{
System.out.println("t构造块4");
}
public X() {
System.out.println("t构造函数 块 4!");
}
}
class T extends St {
static {
System.out.println("t静态代码块3");
}
{
System.out.println("t构造块3");
}
public T() {
System.out.println("t构造函数 块 3!");
}
}
class St extends TestStatic {
static {
System.out.println("st静态代码块2");
}
{
System.out.println("st构造块2");
}
public St() {
System.out.println("st构造函数 块 2!");
}
}
public class TestStatic {
// 静态代码块 只加载一次 静态加载早于非静态
static {
System.out.println("静态代码块1");
}
/*
* 构造代码块在创建对象时被调用,每次创建对象都会调用一次,
* 但是优先于构造函数执行。需要注意的是,听名字我们就知道,
* 构造代码块不是优先于构造函数执行,而是依托于构造函数,也就是说,如果你不实例化对象,构造代码块是不会执行的。
*/
{
System.out.println("构造块1");
}
public TestStatic() {
System.out.println("构造函数 1!");
}
/*
* 当涉及到继承时,按照如下顺序执行:
执行父类的静态代码块,并初始化父类静态成员变量
执行子类的静态代码块,并初始化子类静态成员变量
执行父类的构造代码块,执行父类的构造函数,并初始化父类普通成员变量
执行子类的构造代码块, 执行子类的构造函数,并初始化子类普通成员变量
*/
}
测试类
package com.bdqn.overload;
public class Testf {
public static void main(String[] args) {// 值传递
// 静态代码块>构造代码块>构造函数>普通代码块
TestStatic ts = new TestStatic();
St s = new St();
T t = new T();
X x = new X();
String a = "abc";
String b = "abc";
String c = new String("abc");
String d = "a" + "b" + "c"; // 相当于 "abc"
System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == d);
System.out.println(d == a);
}
}
输出结果:
静态代码块1
构造块1
构造函数 1!
st静态代码块2
构造块1
构造函数 1!
st构造块2
st构造函数 块 2!
t静态代码块3
构造块1
构造函数 1!
st构造块2
st构造函数 块 2!
t构造块3
t构造函数 块 3!
t静态代码块4
构造块1
构造函数 1!
st构造块2
st构造函数 块 2!
t构造块3
t构造函数 块 3!
t构造块4
t构造函数 块 4!
true
false
false
true