靜態代碼塊和構造代碼塊的區別


版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/CronousGT/article/details/78390933
package gt;

/**
* Created by Cronous on 2017/10/29.
* 靜態代碼塊和構造代碼塊的區別
*/
public class day01 {

public static void main(String[] args){
Person p1 = new Person("tom");
Person p2 = new Person("jerry");
p1.sayHello();
p2.sayHello();
}
}

class Person{
private String name;
static int i = 2;//靜態變量
Person(){}
Person(String name){
this.name = name;
}
//靜態代碼塊
static{
System.out.println("進來了!");
//這里我們可以對類1進行初始化操作,比如修改靜態變量值
i = i + 1;
}
public void sayHello(){
System.out.println("name = " + name + " ,i = " + i);
}
}
控制台輸出如下:

進來了!
name = tom ,i = 3
name = jerry ,i = 3

我們可以根據控制台的輸出了解到,static代碼塊部分作用於類,它只是執行一次,用於類的初始化,這里我們使用了靜態變量做了個例子,我們在初始化的時將

i 的值初始化為 3,之后所有創建的對象i的值都是一樣的。

 

我們再看看構造代碼塊

package gt;

/**
* Created by Cronous on 2017/10/29.
* 靜態代碼塊和構造代碼塊的區別
*/
public class day01 {

public static void main(String[] args){
Person p1 = new Person("tom");
Person p2 = new Person("jerry");
//p1.sayHello();
//p2.sayHello();
}
}

class Person{
private String name;
Person(){}
Person(String name){
this.name = name;
}
//構造代碼塊
{
cry();
}
public void cry(){
System.out.println("哇哇哇!!!" + name);
}
public void sayHello(){
System.out.println("name = " + name );
}
}
這里我們看到我們將p1.sayHello()和p2.sayHello()全部注釋掉,發現控制台打印如下:
哇哇哇!!!null
哇哇哇!!!null

說明每個對象初始化都會先調用構造代碼塊中的內容,用於對象的初始化,並且通過 name = null 可以說明構造代碼塊內容是優先於構造函數執行的。

總結如下:

靜態代碼塊作用於類,主要用於類的初始化操作,並且只執行一次;

構造代碼塊作用於對象,主要用於對象的初始化操作,只要有對象創建都會執行,並且優先級由於構造函數;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM