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
對於這些知識點比較碎,而且比較亂的知識經過總結立刻就感覺清楚了很多。