1. 程式人生 > >類中final static常量,靜態變數以及靜態程式碼塊相關問題

類中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、 靜態方法中可以直接呼叫同類中的靜態成員,但不能直接呼叫非靜態成員。如: 如果希望在靜態方法中呼叫非靜態變數,可以通過建立類的物

javastatic使用--靜態變數靜態方法

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傳一個有一個list400,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

JavaStatic關鍵字

Java之關鍵字static:   (1)在類中,變數的前面有修飾符static稱為靜態變數(類變數),方法的前面有修飾符static稱為靜態方法(類方法)。靜態方法和靜態變數是屬於某一個類,而不屬於類的物件。   (2)可以直接通過類名引用靜態方法和靜態變數。 例如:類