1. 程式人生 > >Java基礎6:代碼塊與代碼加載順序

Java基礎6:代碼塊與代碼加載順序

+= keyword 釋放空間 避免 contain clas 接下來 一次 自動

Java基礎6:代碼塊與代碼加載順序

代碼塊:用{}包圍的代碼

java中的代碼塊按其位置劃分為四種:

局部代碼塊

位置:局部位置(方法內部)

作用:限定變量的生命周期,盡早釋放,節約內存

調用:調用其所在的方法時執行

 public class 局部代碼塊 {
@Test
public void test (){
B b = new B();
b.go();
}
}
class B {
B(){}
public void go() {
//方法中的局部代碼塊,一般進行一次性地調用,調用完立刻釋放空間,避免在接下來的調用過程中占用棧空間
//因為棧空間內存是有限的,方法調用可能會會生成很多局部變量導致棧內存不足。
//使用局部代碼塊可以避免這樣的情況發生。
{
int i = 1;
ArrayList<Integer> list = new ArrayList<>();
while (i < 1000) {
list.add(i ++);
}
for (Integer j : list) {
System.out.println(j);
}
System.out.println("gogogo");
}
System.out.println("hello");
}
}

構造代碼塊

位置:類成員的位置,就是類中方法之外的位置

作用:把多個構造方法共同的部分提取出來,共用構造代碼塊

調用:每次調用構造方法時,都會優先於構造方法執行,也就是每次new一個對象時自動調用,對 對象的初始化

class A{
int i = 1;
int initValue;//成員變量的初始化交給代碼塊來完成
{
//代碼塊的作用體現於此:在調用構造方法之前,用某段代碼對成員變量進行初始化。
//而不是在構造方法調用時再進行。一般用於將構造方法的相同部分提取出來。
//
for (int i = 0;i < 100;i ++) {
initValue += i;
}
}
{
System.out.println(initValue);
System.out.println(i);//此時會打印1
int i = 2;//代碼塊裏的變量和成員變量不沖突,但會優先使用代碼塊的變量
System.out.println(i);//此時打印2
//System.out.println(j);//提示非法向後引用,因為此時j的的初始化還沒開始。
//
}
{
System.out.println("代碼塊運行");
}
int j = 2;
{
System.out.println(j);
System.out.println(i);//代碼塊中的變量運行後自動釋放,不會影響代碼塊之外的代碼
}
A(){
System.out.println("構造方法運行");
}
}
public class 構造代碼塊 {
@Test
public void test() {
A a = new A();
}
}

靜態代碼塊

 位置:類成員位置,用static修飾的代碼塊
?
作用:對類進行一些初始化 只加載一次,當new多個對象時,只有第一次會調用靜態代碼塊,因為,靜態代碼塊 是屬於類的,所有對象共享一份
?
調用: new 一個對象時自動調用
?
public class 靜態代碼塊 {
?
@Test
public void test() {
C c1 = new C();
C c2 = new C();
//結果,靜態代碼塊只會調用一次,類的所有對象共享該代碼塊
//一般用於類的全局信息初始化
//靜態代碼塊調用
//代碼塊調用
//構造方法調用
//代碼塊調用
//構造方法調用
}
?
}
class C{
C(){
System.out.println("構造方法調用");
}
{
System.out.println("代碼塊調用");
}
static {
System.out.println("靜態代碼塊調用");
}
}

執行順序 靜態代碼塊 (按順序加載)—–> 構造代碼塊 ——-> 構造方法

Java基礎6:代碼塊與代碼加載順序