当在Java类中定义一个方法或者属性时,这些元素都会被封装在类体中。除了普通属性和方法,Java中还有一些特殊的代码块,包括静态代码块、构造代码块、构造函数和普通代码块。本文将介绍这些代码块的区别。
静态代码块
静态代码块的作用是在类的加载和初始化阶段执行,只会被执行一次。通常用于进行一些预处理操作,如加载驱动,数据库连接等。静态代码块使用static
关键字修饰,一般位于类的顶部。
public class Demo {
static{
// 静态代码块
}
}
构造代码块
构造代码块位于类中所有构造函数之前,用于在创建对象时统一进行成员变量的初始化操作。每次创建对象时都会执行构造代码块,并且在构造函数之前执行。构造代码块使用花括号包围。
public class Demo{
{
// 构造代码块
}
...
}
构造函数
构造函数在Java中是一种特殊的方法,主要用于对象的初始化,包含了创建对象时必要的各种操作。它具有与类同名的名称,没有返回类型,并且可以有多个参数。构造函数和构造代码块一起,可以为对象属性赋初值。
public class Demo{
public Demo(){
// 构造函数
}
...
}
普通代码块
普通代码块也称为局部代码块,作用域限定在代码块内部。通常用于在一个方法中执行当前方法所需的部分逻辑。普通代码块使用花括号包围。
public class Demo{
public void print(){
{
// 普通代码块
}
...
}
}
通过上面的介绍,我们可以得出以下两个例子来进一步说明上述的四种代码块的执行顺序和作用:
public class Demo{
static{
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public Demo(){
System.out.println("构造函数");
}
public void print(){
{
System.out.println("普通代码块1");
}
{
System.out.println("普通代码块2");
}
}
public static void main(String[] args){
Demo demo = new Demo();
demo.print();
}
}
执行结果如下:
静态代码块
构造代码块
构造函数
普通代码块1
普通代码块2
从上述结果可以看出,在创建对象时,首先执行静态代码块,然后执行构造代码块,最后执行构造函数。普通代码块的执行顺序则根据代码块定义的顺序执行。
另一个例子:
public class Demo{
static String str;
{
System.out.println("构造代码块执行前str=" + str);
str = "构造代码块赋值";
System.out.println("构造代码块执行后str=" + str);
}
public Demo(){
System.out.println("构造函数执行前str=" + str);
str = "构造函数赋值";
System.out.println("构造函数执行后str=" + str);
}
public void print(){
{
System.out.println("普通代码块前str=" + str);
str = "普通代码块赋值1";
System.out.println("普通代码块后str=" + str);
}
{
System.out.println("普通代码块前str=" + str);
str = "普通代码块赋值2";
System.out.println("普通代码块后str=" + str);
}
}
public static void main(String[] args){
Demo demo = new Demo();
demo.print();
}
}
执行结果如下:
构造代码块执行前str=null
构造代码块执行后str=构造代码块赋值
构造函数执行前str=构造代码块赋值
构造函数执行后str=构造函数赋值
普通代码块前str=构造函数赋值
普通代码块后str=普通代码块赋值1
普通代码块前str=普通代码块赋值1
普通代码块后str=普通代码块赋值2
从结果可以看出,当对象创建时,以static
关键字修饰的静态变量会首先被初始化为默认值(null
和0
等),然后执行静态代码块,变量值被赋值为代码块的赋值值。接着,执行构造代码块块和构造函数,变量值被更新为上述两个代码块的赋值值,但是顺序是根据代码书写顺序执行的。最后,执行普通代码块,变量值也被更新为这两个普通代码块的赋值值,但是顺序同样也是根据代码书写顺序执行的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中静态代码块、构造代码块、构造函数和普通代码块的区别 - Python技术站