代码块:就是用{}括起来的有一定特殊作用的代码
首先看如下的一段代码:
class Baby
{
int age;
String name;
//下面这段代码是构造代码块
{
System.out.println("哇哇地哭");
age = 0;
}
//下面这段代码是静态代码块
static
{
System.out.println("妈妈");
}
Baby()
{}
Baby(String name)
{
this.name = name;
}
}
class StaticDemo
{
public static void main(String[] args)
{
Baby p1 = new Baby();
Baby p2 = new Baby("旺财");
//下面这段代码是局部代码块
{
int i = 0;
i++;
}
int i = -1;
System.out.println(i);
}
}
其运行结果如图:
构造代码块:它作用就是对类的对象进行初始化。不同于构造函数,构造代码块用于初始化该类对象的共性的东西,比如上面的一段代码。我们对刚出生的婴儿定义一个类。这些婴儿有共性的东西:刚出生都会哇哇的哭,刚出生年龄都是0岁。这段代码如果放到构造函数中初始化,就需要在重载的每个构造函数中都写上这样重复的代码。所以为了提高代码复用性,和简洁性。只需在构造代码块中一次性初始化即可。每new一个新对象时,都会运行构造代码块中的内容。
而构造函数用于初始化该类对象个性化的东西,比如婴儿的名字。不是每个婴儿刚出生都有名字的,而且有名字的也不相同。那对于名字的初始化就要用构造函数了
静态代码块:它用于对类进行初始化。当类在内存中加载时,就会运行。在java中,类加载在内存的方法区中,且用到该类时,才会加载到内存的方法区中,直到程序结束才释放。所以静态代码块只执行一次(即类加载到内存时),和定义几次对象没有关系,它是属于一个类的。而静态代码块是最先运行的,如上的一段代码中,与代码顺序无关,静态代码块执行顺序先于构造代码块。原因很简单,静态代码块在类加载到内存时就运行了,而构造代码块在实例化对象时才运行。
局部代码块:它主要用于对变量的生命周期进行控制。局部代码块里的变量只在{}里有效,出了括号,里面的变量就已经在内存空间中释放了。在现实开发中,一个项目很大,有些变量只需要用一下,那就可以用局部代码块控制它的生命周期,这样既减少了内存空间的占用,又可以随时重复的使用该变量名。比如for循环中定义的变量i,for循环结束后,它随即释放。后面循环依旧可以用i作为自增变量