本文目錄一覽:
Java中靜態塊的用法
結果:
10
首先,static模塊在類加載中首先會被加載且只會被加載一次,構造函數則可以多次加載。
加載順序為:static模塊、構造方法
主方法(程序入口)main方法中,new A();,所以會去加載static{}。在static中又一次new A,所以會調用其構造方法public A() {},此時打印出來的內容是 i=0 j=0,二者都是初始化的值。
static模塊加載之後,會去加載其構造方法。此時i在static中賦值為10,j不變,所以在構造方法的第二次調用中打印的是i=10 j=0。
JAVA中 靜態塊的作用
我先說一下靜態塊吧,下面就是一個靜態塊,
static
{
}
靜態塊的特點是在類加載的時候就執行,先說一下類加載,一個程序要想運行,首先要把代碼加載到內存中對吧?然後才能去和CPU交流,這是馮諾依曼計算機規定的。Java也是一樣,Java的.class字節碼文件要想執行,首先也要加載到內存,由類加載器把字節碼文件的代碼加載到內存中,這一步就叫類加載,這是首先要進行的。
public
class
Test
{
static
{
System.out.println(“我是靜態塊”);
}
}
當創建Test類的一個對象的時候,比如new
Test()
,是這樣,首先是類加載,然後才能new對象,靜態塊在類加載的時候就執行了,這就說明靜態塊在new對象之前就會執行,而且一個類在第一次被使用的時候會被加載,然後在整個應用程序的生命周期當中不會再次被加載了,就加載這一次,所以這就說明,靜態塊就執行一次,不會執行第二遍!
public
class
Test
{
public
Test()
{//
構造方法
System.out.println(“我是構造方法,創建對象的時候我會執行,我執行完,對象就造出來了”);
}
static
{
System.out.println(“我是靜態塊,類加載的時候我就執行了,而且只執行這一次”);
}
}
然後這樣:
new
Test();
new
Test();
你會發現首先打印出靜態塊的信息,然後才打印出構造方法信息,然後再次new
Test();的時候,只打印出了構造方法的信息,這個例子證明了我上面說的是對的!
這就是靜態塊,我說完了,至於你說的
靜態塊中初始化Map。
初始化這幾個字很難講他的意思,意思包括
把一些內容設為默認狀態、把沒準備的準備好、在什麼什麼之前就怎麼怎麼樣、將變量賦為默認值,等等,這個不能精確的說,只能就事說事,下面就可以說是在靜態塊中初始化Map,
public
class
Test
{
private
static
Map
m;
static
{
m
=
new
HashMap();
}
}
就說道這兒,樓主
看了一個帖子
寫的是初始化Map的,
如果還有疑問
不如把地址貼出來,大家也好幫你,就光說初始化Map,這個問的太叫人沒法回答了。
java中的靜態代碼塊、代碼塊、構造器的執行順序是怎樣呢,這三者有什麼作用呢
先說執行順序:我們在new一個對象時,如果類還沒加載,就需要先將類加載到內存,此時就會執行靜態代碼塊,在創建對象時,是先執行代碼塊,然後執行構造器。所以靜態代碼塊、代碼塊、構造器的執行順序是:靜態代碼塊→代碼塊→構造器。
再說作用:靜態代碼塊是用於初始化類的(在加載類時執行,只執行一次),代碼塊是用於初始化對象的(在創建對象時執行,每次創建對象時都執行),構造器是用於創建對象的。
java中什麼是自由塊,什麼是靜態自由塊?
自由塊:
{
int i = 0;
}
靜態塊:
static{
int j = 0
}
其中自由塊和靜態塊的區別: 在第一次加載這個類的時候,靜態塊和自由塊都執行,而且先執行靜態塊的內容,第二次加載這個類的時候,只執行自由塊的內容,也就是說靜態塊的內容只執行一次,以後加載都不執行了,你可以看看下面的例子就明白了:
public class StaticTest {
public static void main(String[] args) {
StaticInfo staticInfo1 = new StaticInfo();
staticInfo1.test1();
System.out.println(“=======================”);
StaticInfo staticInfo2 = new StaticInfo();
staticInfo2.test2();
}
}
class StaticInfo{
{
System.out.println(“自由塊”);
}
static {
System.out.println(“靜態塊”);
}
public void test1(){
System.out.println(“測試1”);
}
public void test2(){
System.out.println(“測試2”);
}
}
輸出:
靜態塊
自由塊
測試1
=======================
自由塊
測試2
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/238433.html