導航:首頁 > 編程語言 > java非靜態塊

java非靜態塊

發布時間:2022-06-24 06:23:14

1. java 中靜態代碼和非靜態代碼塊的區別!

相同點:都是在JVM載入類時且在構造方法執行之前執行,在類中都可以定義多個,
一般在代碼塊中對一些static變數進行賦值。
不同點:靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊—>非靜態代碼塊—>構造方法)。
靜態代碼塊只在第一次new執行一次,之後不再執行,而非靜態代碼塊在每new
一次就執行一次。非靜態代碼塊可在普通方法中定義(不過作用不大);而靜態代碼塊不行。
例:
//普通類
public class PuTong {
public PuTong(){
System.out.print("默認構造方法!-->");
}

//非靜態代碼塊
{
System.out.print("非靜態代碼塊!-->");
}

//靜態代碼塊
static{
System.out.print("靜態代碼塊!-->");
}

public static void test(){
{
System.out.println("普通方法中的代碼塊!");
}
}
}

//測試類
public class TestClass {

/**
* 區別兩次new靜態與非靜態代碼塊執行情況
*/
public static void main(String[] args) {
PuTong c1 = new PuTong();
c1.test();

PuTong c2 = new PuTong();
c2.test();
}
}

/*
運行輸出結果是:
靜態代碼塊!-->非靜態代碼塊!-->默認構造方法!-->普通方法中的代碼塊!
非靜態代碼塊!-->默認構造方法!-->普通方法中的代碼塊!
*/

2. java 中靜態代碼和非靜態代碼塊的區別

區別很簡單:
靜態代碼塊,在虛擬機載入類的時候就會載入執行,而且只執行一次;
非靜態代碼塊,在創建對象的時候(即new一個對象的時候)執行,每次創建對象都會執行一次

3. 在java中,什麼叫靜態,什麼叫非靜態

由static
關鍵修飾的內容
為靜態

反之
,為非靜態
靜態變數
屬於

,為所有對象共有
分靜態變數
屬於
對象

每個對象都可以有且屬性值可以各異
靜態變數優於非靜態變數載入,故
靜態代碼塊中不能引用非靜態成員,會報錯

4. 淺談JAVA中靜態初始化塊和非靜態初始化塊的區別

非靜態初始化塊,是指構造方法吧
靜態的訪問不了成員變數,除了工廠模式,其他用的很少

5. java中為什麼非靜態塊在構造方法之前執行

JVM虛擬機類的載入順序就是如此
虛擬機在首次載入Java類時,會對靜態初始化塊、靜態成員變數、靜態方法進行一次初始化

6. Java的靜態塊和初始化塊分別何時執行有什麼區別

靜態初始化塊:當類第一次載入時執行。

非靜態初始化塊:非靜態初始化塊會在構造函數執行時,且在構造函數主體代碼執行之前被執行。

區別如下:

1、執行次數不同

靜態塊只執行一次,初始化塊可以執行多次。

2、作用不同

靜態初始化塊僅能初始化類變數,即static修飾的數據成員。

非靜態初始化塊可以初始化類的實例變數。

(6)java非靜態塊擴展閱讀:

使用Java靜態代碼塊注意事項:

1、它是隨著類的載入而執行,只執行一次,並優先於主函數。具體說,靜態代碼塊是由類調用的。類調用時,先執行靜態代碼塊,然後才執行主函數的。

2、靜態代碼塊其實就是給類初始化的,而構造代碼塊是給對象初始化的。

3、靜態代碼塊中的變數是局部變數,與普通函數中的局部變數性質沒有區別。

4、一個類中可以有多個靜態代碼塊。

5、對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的初始化順序依次是(靜態變數、靜態初始化塊)>(變數、初始化塊)>構造器。

7. java 靜態類和非靜態類的區別

靜態類和非靜態類的主要區別:
主要區別在於靜態類不能實例化,靜態類編譯器能夠執行檢查確保不是偶然的添加實例成員,C#編譯器會自動把它標記為sealed,靜態類中不能創建非靜態的方法,即靜態方法中只能創建靜態方法,但在非靜態類中可以調用靜態方法。
靜態類的主要特性:
1:僅包含靜態成員。
2:無法實例化。
3:是密封的。
4:不能包含實例構造函數。
5:非靜態類可以包含靜態的方法、欄位、屬性或事件;
6:靜態方法和屬性不能訪問其包含類型中的非靜態欄位和事件
7:靜態方法只能被重載,而不能被重寫,因為靜態方法不屬於類的實例成員;
8:C# 不支持靜態局部變數(在方法內部定義靜態變數)。
非靜態類在使用時必須要實例化,每次使用時都要進行實例化,一般情況下使用比較頻繁的類,可以使用靜態類,比如LogClass,ConfigClass等等。

8. JAVA 靜態代碼塊和非靜態代碼塊 作用

靜態代碼塊是在類載入進jvm時類實例化之前運行的,比如業務場景有這種類初始化時需要載入許多資源,在運行實例化類的時候會影響程序響應時間,所以就在項目啟動的時候載入類的時候就初始化了.非靜態代碼塊是在類實例化的時候才會運行,所以靜態代碼塊的執行一定在非靜態代碼塊執行之前執行.至於你上面的第一個問題要看具體業務場景和需求,賦值都可以實現.第二個問題,可能是寫那句代碼的人要看程序載入後有沒有執行那部分代碼而加上的,知道了靜態代碼塊和非靜態代碼塊的本質區別,為什麼那麼做和目的你就應該知道了.

9. Java中非靜態方法是否共用同一塊內存

答案是不會,我們用field表示欄位,用method表示方法,那麼加上static區分後就 有四種:
class field:有用static修飾的field
class method:有用static修飾的method
instance field:沒有用static修飾的field
instance method:沒有用static修飾的method
那麼他們在內存中的表示為:
class field:共用一塊記憶體
class method:共用一塊記憶體
instance field:隨著每個instance各有一塊記憶體
instance method:共用一塊記憶體
如果instance method也隨著instance增加而增加的話,那內存消耗也太大了,為了做到共用一小段內存,Java是根據this關鍵字做到的,比如:instance1.instanceMethod(); instance2.instanceMethod(); 在傳遞給對象參數的時候,Java編譯器自動先加上了一個this參數,它表示傳遞的是這個對象引用,雖然他們兩個對象共用一個方法,但是他們的方法中所產生的數據是私有的,這是因為參數被傳進來變成call stack內的entry,而各個對象都有不同call
stack,所以不會混淆。其實調用每個非static方法時,Java編譯器都會自動的先加上當前調用此方法對象的參數,有時候在一個方法調用另一個方法,這時可以不用在前面加上this的,因為要傳遞的對象參數就是當前執行這個方法的對象。
為什麼靜態方法中不能調用非靜態方法?這是因為靜態方法直接跟class相關,調用此方法的時候是類直接調用的,而不是對象,所以Java編譯器就沒有對象參數可以傳遞,這樣,如果你在靜態方法內部調用非靜態方法,那麼Java編譯器怎麼判斷這個非靜態方法是哪個對象調用的?對吧,所以Java編譯器就會報錯,但是也不是絕對的,Java編譯器是隱式的傳遞對象參數,那麼我們總可以顯示的傳遞對象參數吧,如果我們把某個對象的引用傳遞到static方法里,然後通過這個引用就可以調用非靜態方法和訪問非靜態數據成員了。
也是一樣的,方法都屬於類數據,類數據都放在方法區中,《深入java虛擬機》有一個虛擬機的體系結構,在那裡你可以看到線程都放在java棧里,棧幀代表一個方法的返回狀態,執行完一個方法就會彈出這個棧幀,方法區和堆中的數據時所有線程都共享的,所以這里沒有線程的區分。

10. java非靜態代碼塊和構造代碼塊是同一種嗎

構造塊:直接在類中定義且沒有加static關鍵字的代碼塊稱為{}構造代碼塊。構造代碼塊在創建對象時被調用,每次創建對象都會被調用,並且構造代碼塊的執行次序優先於類構造函數。

普通代碼塊:在方法或語句中出現的{}就稱為普通代碼塊。普通代碼塊和一般的語句執行順序由他們在代碼中出現的次序決定--「先出現先執行」

閱讀全文

與java非靜態塊相關的資料

熱點內容
代碼加密常用方法 瀏覽:950
安卓手機如何解除已禁用 瀏覽:396
演算法的隨機性 瀏覽:485
高中解壓體育游戲 瀏覽:532
androidstudior丟失 瀏覽:345
命令行筆記 瀏覽:737
360目標文件夾訪問拒絕 瀏覽:518
3b編程加工指令 瀏覽:789
c8051f系列單片機選型手冊 瀏覽:772
南昌php程序員 瀏覽:511
bcs命令 瀏覽:446
如何在伺服器指向域名 瀏覽:417
車床編程可以做刀嗎 瀏覽:519
ln命令源碼 瀏覽:791
用粘液做解壓手套 瀏覽:331
icloud收信伺服器地址 瀏覽:500
編程思考者 瀏覽:453
壓縮機型號用什麼氟利昂 瀏覽:553
農機空氣壓縮機 瀏覽:666
程序員下載歌曲 瀏覽:897