類中final static常量,靜態變數以及靜態程式碼塊相關問題
作者在學習過程中,遇到了有關靜態程式碼塊的現象,故寫此部落格記錄下來。
首先先介紹下static概念
當在定義類的時候,類中都會有相應的屬性和方法。而屬性和方法都是通過建立本類物件呼叫的。當在呼叫物件的某個方法時,這個方法沒有訪問到物件的特有資料時,方法建立這個物件有些多餘。可是不建立物件,方法又調用不了,這時我們可以通過static關鍵字來實現。static它是靜態修飾符,一般用來修飾類中的成員。
static是靜態修飾符,一般修飾成員。被static修飾的成員屬於類,不屬於單個這個類的某個物件。
static修飾的成員被多個物件共享。
static修飾的成員屬於類,但是會影響每一個物件。
被static修飾的成員又叫類成員,不叫物件的成員。
本文分為三種情況去判斷
案例1.main方法在靜態變數所有類的內部
public class Person { public static int a = 10; public final static int b=20; public Person(){ System.out.println("構造方法執行了"); } //成員程式碼塊 構造程式碼塊 { System.out.println("構造程式碼塊執行了"); } //靜態程式碼塊 static{ System.out.println("靜態程式碼塊執行了"); } public static void main(String[] args) { //判斷呼叫未用final修飾的靜態變數 //System.out.println(Person.a); //判斷用final修飾的靜態常量 System.out.println(Person.b); }
輸出結果:靜態程式碼塊執行了
20
輸出結果2:靜態程式碼塊執行了
10
結論1:
當main方法在靜態變數所有類的內部時,無論呼叫被static修飾的變數還是用final static修飾的變數,
靜態程式碼塊都會被呼叫。
案例2.使用測試類的main方法來訪問靜態變數/常量。
新定義Test類,呼叫其main方法來測試案例二
public class Test { public static void main(String[] args) { //判斷用一般的靜態變數 //System.out.println(Person.a); //判斷用final修飾的靜態常量 System.out.println(Person.b); } }
判斷用final修飾的靜態常量
輸出結果:
20
判斷一般的靜態變數
輸出結果:
靜態程式碼塊執行了
10
結論2:
當訪問類中常量的時候,並不呼叫靜態程式碼塊的資料,此時類並沒有被載入進記憶體。
案例3.靜態變數與靜態程式碼塊的執行順序
靜態常量,靜態變數,靜態方法, 都是通過類名直接呼叫的(例如:Person.a ),而靜態程式碼塊,則是在類被載入到記憶體的時候呼叫。
而他們之間的執行先後順序則是根據程式碼的編寫順序來決定的。舉例
public class Person {
static {
i=10;
}
static int i=20;
}
此時main函式呼叫Person.a,輸出20
public class Person {
static int i=20;
static {
i=10;
}
}
此時main函式呼叫Person.a,輸出10
結論3:
上述的程式碼說明 static修飾的靜態程式碼塊和靜態變數執行的順序是根據程式碼編寫的先後,一般都將靜態變數寫在靜態程式碼塊的上方。
相關推薦
類中final static常量,靜態變數以及靜態程式碼塊相關問題
作者在學習過程中,遇到了有關靜態程式碼塊的現象,故寫此部落格記錄下來。首先先介紹下static概念當在定義類的時候,類中都會有相應的屬性和方法。而屬性和方法都是通過建立本類物件呼叫的。當在呼叫物件的某個方法時,這個方法沒有訪問到物件的特有資料時,方法建立這個物件有些多餘。可是
java中靜態類和靜態變數和靜態方法分別有什麼特點?
一、static 請先看下面這段程式:public class Hello{ public static void main(String[] args){ //(1) System.out.println("Hello,world!"); //(2
java中類載入與靜態變數、靜態方法與靜態程式碼塊詳解與初始化順序
我們知道java中類的生命週期為裝載、連線、初始化、使用和解除安裝五個過程,如下圖所示:1.載入 我們編寫一個java類的程式碼,經過編譯之後生成一個字尾名為.class的檔案,java虛擬機器就能識別這種檔案。java的生命週期就是class檔案從載入到消亡的過程。
C++中類內成員的定義,宣告總結(靜態和非靜態成員)
近學習到C++ primer中關於類中靜態變數的部分,有一道課後題非常有意思。 題目是關於靜態變數在類中的初始化。 class example{ public: //static double rate=6.5; static const int size
Java 中的 static 使用之靜態變數與靜態方法
與靜態變數一樣,我們也可以使用 static 修飾方法,稱為靜態方法或類方法。其實之前我們一直寫的 main 方法就是靜態方法。靜態方法的使用如: 需要注意: 1、 靜態方法中可以直接呼叫同類中的靜態成員,但不能直接呼叫非靜態成員。如: 如果希望在靜態方法中呼叫非靜態變數,可以通過建立類的物
java中的static使用--靜態變數、靜態方法
Java 中的 static 使用之靜態變數 大家都知道,我們可以基於一個類建立多個該類的物件,每個物件都擁有自己的成員,互相獨立。然而在某些時候,我們更希望該類所有的物件共享同一個成員。此時就是 static 大顯身手的時候了!! Java 中被 static 修飾的成
C++ 模板類中的static變數和函式 初始化
關鍵詞: C++ 模板 static 變數 函式 初始化 這篇文章主要介紹關於模板類中如果有static變數如何初始化問題。 重要:如果不初始化static變數,那麼編譯可能沒有問題,但是程式有問題,可能編譯有問題,但是不能確定是初始化問題。 #include"ios
php--在類中聲明常量的關鍵字
繼承 con def 屬性 實例 類名 () 接口 屬性。 Final、static、const、instanceod Final :final關鍵字可以加在類或者類中方法之前,但是不能使用final標識成員屬性。 作用: 使用final標識的類,不能被繼承。
窗體的基類中沒有設定大小,所以才不能居中,若要窗體居中,必須使用setfixedsize()函數或者resize()函數設定窗體的大小,居中才能正常使用
argv parent tails comment styles key har 位置 遇到 最近開發中,遇到了窗體不能居中的問題,看了網上的很多文章,窗口居中,無非都是move至窗口的中心目標; 有兩種方式, 一種在構造函數中直接計算中心坐標; 另一種是在窗口show後再
web工程啟動時,在一個類中延遲載入Bean,因為該Bean類可能還沒被JVM載入
問題描述: (1)javaWeb專案啟動中,還沒啟動完成,在下面這個類載入另一個Bean類, (2)通過getBean方法獲取到該Bean,可以獲取到,不為null (3)但是,呼叫該Bean的方法insertSelective()方法,進不去該方法 &nb
深入理解Java中的同步靜態方法和synchronized(class)程式碼塊的類鎖 深入理解Java併發synchronized同步化的程式碼塊不是this物件時的操作
一.回顧學習內容 在前面幾篇部落格中我我們已經理解了synchronized物件鎖、物件鎖的重入、synchronized方法塊、synchronized非本物件的程式碼塊, 連結:https://www.cnblogs.com/SAM-CJM/category/1314992.h
java異常練習題:定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果
題目描述: 定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。 定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義
Java中的靜態變數和靜態函式
Java中的靜態變數和靜態函式 靜態變數: 在JAVA中類在宣告的時候,其實並沒有申請和產生記憶體空間,就如同我們的一個切實可行的想法,但其實並沒有去實施這個想法。而類只有在用這種資料型別建立一個類的物件的時候,才能在記憶體中申請和產生類大小的記憶體空間,這一塊記憶體空間是用來存放
1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。
1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。 2).定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義一個方法,在方法中丟
C#中靜態變數 、靜態方法的說明
1.靜態變數在C#程式中,沒有全域性變數的概念,這意味著所有的成員變數只有該類的例項才能操作這些資料,這起到了“資訊隱藏”的作用。但有些時候,這樣做卻不是個明智的選擇。假設我們要定義一個圖書類,要求該類能儲存圖書的數量,即每增加一本圖書(定義一個例項),圖書的數量應該加1。如果沒有靜態變數,我們需要將圖書的數
C#中靜態變數和 靜態方法
C#中靜態變數和 靜態方法 static節省了構造物件時造成的效能損耗,其次還能用於一些特殊環境(如惡漢式單例) 但是由於靜態成員在程式載入之前就進入記憶體,直到程式結束才會銷燬,所以 在程式中如果大量使用static來宣告型別或成員,也會造成系統資源的浪費。 一般靜態的就代表全域性。表示任何類
向controller傳一個類,類中有一個list,400,415,500
報錯有可能是json格式不對,controller沒有@RequestBody,ajax沒有 contentType: 'application/json;charset=UTF-8', data: JSON.stringify(datas),//data沒有JSON.stringify()
java map常量定義 Java中定義Map常量,List常量
https://www.cnblogs.com/leonxiaosi/p/6928604.html Java中定義Map常量,List常量 一般的方式的使用靜態程式碼塊。比如:
python中的字串常量,是否支援通過下標的方式賦值
說明: 今天在看python,通過下標獲取字串常量的字元,在想是否可以通過下標的方式賦值。 操作: 1.對字串下標賦值 >>> text='python' >>> text[2] = 'j' Traceback (most recent call la
Java類中的Static關鍵字
Java之關鍵字static: (1)在類中,變數的前面有修飾符static稱為靜態變數(類變數),方法的前面有修飾符static稱為靜態方法(類方法)。靜態方法和靜態變數是屬於某一個類,而不屬於類的物件。 (2)可以直接通過類名引用靜態方法和靜態變數。 例如:類