細說final關鍵字和static關鍵字

               final關鍵字和static關鍵字

                      final關鍵字

   final:在翻譯過來的意思就是最後的,最終的,不可改變的意思。在Java中同樣也是這個意思。那到底什麼時候可以用到final來修飾呢?都知道,繼承的應用提高了代碼的複用性,通過繼承,子類可以對父類的方法進行重寫,那如果有些父類中的方法是固定的,不想讓子類進行重寫,要解決這個問題就要用到final關鍵字,final關鍵字可以用來修飾類,類的成員,以及局部變量。

  1、修飾類:final修飾的類是最終類,不能有子類,不能被繼承,但是可以繼承其他類,使用的方式不變,可以創建對象,調用方法。

  2、修飾方法:final修飾的方法不能被子類重寫。

  3、修飾變量:修飾變量的時候也分幾種情況

     a、修飾局部變量:修飾的變量稱爲常量,只能被賦值一次,賦值後終生不變。所以final一般做固定值的修飾。

     b、修飾引用變量:變量保存的是內存的地址,被final修飾後就不能再重新創建。(因爲如果再次用new進行創建就會再次產生新的地址),但是地址內的對象屬性值可以修改。

     成員變量的兩種賦值方式:一種是定義時直接賦值,另一種是通過構造方法賦值(注意:不能用set方法進行賦值)。但是一般都是直接賦值,不通過構造方法賦值。

     c、修飾成員變量:修飾成員變量,固定住的不是內存中的默認值,固定住的是手動賦給成員變量的值。如:final int a=1;

                      static關鍵字

   定義類的時候,類中都會有相應的屬性和方法,然而對這些方法的使用,都是通過創建本類的對象進行調用的,當調用對象的某個方法時,這個方法沒有訪問到對象的特有數據時,方法創建這個對象有些多餘,但是不創建這個對象,方法又調用不了,那這種情況如何解決呢?這是我們就要用到static關鍵字了。Static是靜態修飾符,一般用來修飾類中的成員。

static的特點:

   1、被static修飾的成員變量屬於類,不屬於這個類的某個對象。也就是說,多個對象在訪問或修改static修飾的成員變量時,其中一個對象將static成員變量值進行了修改,其他對象中的static成員變量值跟着改變,即多個對象共享同一個static成員變量。

代碼演示:

class Demo {
	public static int num = 100;
}

class Test {
	public static void main(String[] args) {
		Demo d1 = new Demo();
		Demo d2 = new Demo();
		d1.num = 200;
		System.out.println(d1.num); //結果爲200
		System.out.println(d2.num); //結果爲200
	}
}

  2、被static修飾的成員可以並且建議通過類名直接訪問。

   類名.靜態成員變量名

   類名.靜態成員方法名(參數)

   對象名.靜態成員變量名     ------不建議使用該方式,會出現警告

   對象名.靜態成員方法名(參數)     ------不建議使用該方式,會出現警告

Static注意事項:

  1、靜態內容是優先於對象存在,只能訪問靜態,不能使用this/super。靜態修飾的內容存於靜態區。

  2、同一個類中,靜態成員只能訪問靜態成員,不能直接調用非靜態的。如果想要使用,要先創建對象。原因:生命週期不同,靜態優於非靜態存在於內存中,靜態存在時,非靜態還不存在。

 代碼:

class Demo {
	//成員變量
	public int num = 100;
	//靜態成員變量
	public static int count = 200;
	//靜態方法
	public static void method(){
		//System.out.println(num); 靜態方法中,只能訪問靜態成員變量或靜態成員方法
		System.out.println(count);
	}
}

使用場景:

   成員變量使用static 根據具體的事物,具體分析問題,定義事物的時候,,將共性的數據定義爲靜態的成員變量。

   方法跟着變量走,如果方法中沒有調用非靜態成員變量,需要加靜態。

靜態調用:

   多態調用:編譯都看父類,如果有,編譯成功,否則編譯失敗。運行時:靜態方法運行父類中的靜態方法,,非靜態方法:運行子類中重寫的方法。成員變量:運行編譯都看父類。注意:靜態方法與對象沒有關係。

定義靜態常量:

  開發中,我們想在類中定義一個靜態常量,通常使用public static final修飾的變量來完成定義。此時變量名用全部大寫,多個單詞使用下劃線連接。

定義格式:

   public static final 數據類型 變量名 = 值;

如:

class Company {
	public static final String COMPANY_NAME = "盧肖正";
	public static void method(){
		System.out.println("一個靜態方法");
	}
}
     當我們要使用靜態類時,不需要創建對象,直接使用類名來訪問即可: 

System.out.println(Company.COMPANY_NAME); //打印姓名
Company.method(); // 調用一個靜態方法

注意:   

   接口中的每個成員變量都默認使用public static final修飾。

  所有接口中的成員變量已是靜態常量,由於接口沒有構造方法,所以必須顯示賦值。可以直接用接口名訪問。

如:

interface Inter {
    public static final int COUNT = 100;
}
  // 訪問接口中的靜態變量
Inter.COUNT
    

       對於這些知識點比較碎,而且比較亂的知識經過總結立刻就感覺清楚了很多。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章