Java中静态代码块、构造代码块、构造函数
对于该问题的关注,来自一道笔试题:
public class HelloB extends HelloA
{
//构造函数B
public HelloB() {
System.out.println("+++++++");
}
//构造代码块B
{
System.out.println("I’m B class");
}
//静态代码块B
static
{
System.out.println("static B");
}
public static void main(String[] args)
{
new HelloB();
}
}
class HelloA
{
//构造函数A
public HelloA() { }
//构造代码块A
{
System.out.println("I’m A class");
}
//静态代码块A
static
{
System.out.println("static A");
}
}
执行结果
static A
static B
I’m A class
I’m B class
+++++++
反编译代码
class HelloA {
public HelloA() {
System.out.println("I’m A class");
}
static {
System.out.println("static A");
}
}
public class HelloB extends HelloA {
public HelloB() {
System.out.println("I’m B class");
System.out.println("+++++++");
}
public static void main(String[] args) {
new HelloB();
}
static {
System.out.println("static B");
}
}
静态代码块
1、作用
“静态”的代码、不管是类还是方法、变量,最大的特点就是在类加载时就被初始化。所以,静态代码块用来执行一些在项目启动时就需要执行的代码。例如,加载配置文件等资源。
2、执行时机
- 类加载时就执行,且仅执行一次,先于一切函数,这很好理解,因为是静态代码。需要注意的是,构造函数也是“普通函数”,所以静态代码块也是先于构造函数执行的。
- 静态块之间按顺序执行
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("构造块");
}
static
{
System.out.println("静态块");
}
public static void main(String[] args)
{
B t = new B();
}
}
输出
构造块 构造块 静态块 构造块
也是由于静态的原因:
3、静态代码块不能存在于方法体中
4、静态代码块不能访问非静态变量
构造代码块
1、作用
构造代码块在编译后会合并到该类的所有构造函数中,且在构造函数代码之前,也就是说在初始化该类的新对象时,不论使用的是哪个构造函数,都会执行构造代码块中的代码。
2、执行时机
对象初始化时执行
构造函数
- 构造函数的命名必须和类名完全相同且没有返回值。在java中普通函数也可以和构造函数同名,但是必须带有返回值;
- 构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用
- Java编译器会提供一个默认的不带参构造函数,当自定义构造函数之后就不再提供。