面向對象之static與final關鍵字
final關鍵字和static關鍵字
final關鍵字
final:在翻譯過來的意思就是最後的,最終的,不可改變的意思。在Java中同樣也是這個意思。那到底什麽時候可以用到final來修飾呢?都知道,繼承的應用提高了代碼的復用性,通過繼承,子類可以對父類的方法進行重寫,那如果有些父類中的方法是固定的,不想讓子類進行重寫,要解決這個問題就要用到final關鍵字,final關鍵字可以用來修飾類,類的成員,以及局部變量。
1、修飾類:final修飾的類是最終類,不能有子類,不能被繼承,但是可以繼承其他類,使用的方式不變,可以創建對象,調用方法。
2、修飾方法:final修飾的方法不能被子類重寫。
3、修飾變量:修飾變量的時候也分幾種情況
a、修飾局部變量:修飾的變量稱為常量,只能被賦值一次,賦值後終生不變。所以final一般做固定值的修飾。
b、修飾引用變量:變量保存的是內存的地址,被final修飾後就不能再重新創建。(因為如果再次用new進行創建就會再次產生新的地址),但是地址內的對象屬性值可以修改。
成員變量的兩種賦值方式:一種是定義時直接賦值,另一種是通過構造方法賦值(註意:不能用set方法進行賦值)。但是一般都是直接賦值,不通過構造方法賦值。
c、修飾成員變量:修飾成員變量,固定住的不是內存中的默認值,固定住的是手動賦給成員變量的值。如:final int a=1;
1 package com.oracle.demo01;
2 /*final修飾類:(太監類)
3 被final修飾的類不能被繼承,但可以繼承別的類
4 final修飾成員方法:
5 1.該方法可以被子類繼承,但不能被重寫
6 2.從父類那裏繼承繼承來的方法,重寫後可以加final關鍵字
7 final修飾變量(基本類型還是引用數據類型):
8 一次賦值 終身不變
9 final修飾成員變量:
10 1.成員變量的初始值不能為系統賦的默認值(需要手動賦初始值)
11 2.可以通過構造方法賦值
12 3.一次賦值終身不變*/
13 public class Test {
14 public static void main(String[] args) {
15 Zi zi=new Zi();
16 zi.method1();
17 zi.method2();
18 final int a=1;
19 final Fu fu=new Fu();
20 //System.out.println(a);
21 }
22 }
static關鍵字
定義類的時候,類中都會有相應的屬性和方法,然而對這些方法的使用,都是通過創建本類的對象進行調用的,當調用對象的某個方法時,這個方法沒有訪問到對象的特有數據時,方法創建這個對象有些多余,但是不創建這個對象,方法又調用不了,那這種情況如何解決呢?這是我們就要用到static關鍵字了。Static是靜態修飾符,一般用來修飾類中的成員。
static的特點:
1、被static修飾的成員變量屬於類,不屬於這個類的某個對象。也就是說,多個對象在訪問或修改static修飾的成員變量時,其中一個對象將static成員變量值進行了修改,其他對象中的static成員變量值跟著改變,即多個對象共享同一個static成員變量。
代碼演示:
1 class Demo { 2 3 public static int num = 100; 4 5 } 6 7 8 9 class Test { 10 11 public static void main(String[] args) { 12 13 Demo d1 = new Demo(); 14 15 Demo d2 = new Demo(); 16 17 d1.num = 200; 18 19 System.out.println(d1.num); //結果為200 20 21 System.out.println(d2.num); //結果為200 22 23 } 24 25 }
2、被static修飾的成員可以並且建議通過類名直接訪問。
類名.靜態成員變量名
類名.靜態成員方法名(參數)
對象名.靜態成員變量名 ------不建議使用該方式,會出現警告
對象名.靜態成員方法名(參數) ------不建議使用該方式,會出現警告
對象名.靜態成員方法名(參數) ------不建議使用該方式,會出現警告
Static註意事項:
1、靜態內容是優先於對象存在,只能訪問靜態,不能使用this/super。靜態修飾的內容存於靜態區。
2、同一個類中,靜態成員只能訪問靜態成員,不能直接調用非靜態的。如果想要使用,要先創建對象。原因:生命周期不同,靜態優於非靜態存在於內存中,靜態存在時,非靜態還不存在。
代碼
1 class Demo { 2 3 //成員變量 4 5 public int num = 100; 6 7 //靜態成員變量 8 9 public static int count = 200; 10 11 //靜態方法 12 13 public static void method(){ 14 15 //System.out.println(num); 靜態方法中,只能訪問靜態成員變量或靜態成員方法 16 17 System.out.println(count); 18 19 } 20 21 }
使用場景:
成員變量使用static 根據具體的事物,具體分析問題,定義事物的時候,,將共性的數據定義為靜態的成員變量。
方法跟著變量走,如果方法中沒有調用非靜態成員變量,需要加靜態。
靜態調用:
多態調用:編譯都看父類,如果有,編譯成功,否則編譯失敗。運行時:靜態方法運行父類中的靜態方法,,非靜態方法:運行子類中重寫的方法。成員變量:運行編譯都看父類。註意:靜態方法與對象沒有關系。
定義靜態常量:
開發中,我們想在類中定義一個靜態常量,通常使用public static final修飾的變量來完成定義。此時變量名用全部大寫,多個單詞使用下劃線連接。
定義格式:
public static final 數據類型 變量名 = 值;
如:
class Company { public static final String COMPANY_NAME = "盧肖正"; public static void method(){ System.out.println("一個靜態方法"); } }
當我們要使用靜態類時,不需要創建對象,直接使用類名來訪問即可:
1 System.out.println(Company.COMPANY_NAME); //打印姓名 2 3 Company.method(); // 調用一個靜態方法
註意:
接口中的每個成員變量都默認使用public static final修飾。
所有接口中的成員變量已是靜態常量,由於接口沒有構造方法,所以必須顯示賦值。可以直接用接口名訪問。
如:
interface Inter { public static final int COUNT = 100; } // 訪問接口中的靜態變量 Inter.COUNT
圖解:
面向對象之static與final關鍵字