Java筆記十七.java中的static和final用法,.javastatic
在上幾篇博文中我們知道,當我們編寫一個類時,實際上就是在描述該類對象的屬性和行為,而並沒有產生實質上的對象,只有通過new關鍵字才會產生出對象,這時系統才會分配記憶體空間給對象,其方法才可以供外部調用。但有時候,我們希望無論是否產生了對象或無論產生了多少個對象的情況下,某些特定的資料在記憶體空間裡只有一份,那麼此時static關鍵字就派上用場了。
轉載請表明出處:http://blog.csdn.net/u012637501(嵌入式_小J的天空)一、static關鍵字1.靜態成員變數/方法 在類成員(變數/方法)前加上一個static關鍵字,那麼這個成員就稱為了靜態成員變數/方法。靜態變數在某種程度上與其他語言的全域變數相類似,如果該靜態成員變數不是私人的就可以在類的外部進行訪問,此時不需要產生類的執行個體對象,只需要類名(類名.靜態成員)就可以引用。2.static關鍵字的用法 用static標識符修飾的變數,它們在類被載入時建立,只要類存在,static變數就存在。由於靜態成員變數能被各執行個體對象所共用,所以我們可以用他來實現一些特殊效果。(1)靜態代碼塊 形式:static{.......} 一個類中可以使用不包含在任何方法體中的靜態代碼塊,當類被載入時,靜態代碼塊被執行,且只被執行依次,所以靜態塊常用來進行類屬性的初始化。源碼:TestStatic.java
class staticCode { static String school; static{ school="大學城大學"; //靜態成員變數賦值 System.out.println("I am staticCode"); }}public class TestStatic { static { System.out.println("TestStatic is loading..."); } public static void main(String[] args) { System.out.println("In the main thread"); new staticCode(); new staticCode(); }}
列印資訊:
分析:觀察程式列印的資訊,我們可以得出以下幾點結論。a.類staticCode中的靜態代碼塊被自動執行,儘管產生了類的staticCode的兩個執行個體對象,但其中的靜態代碼塊只被執行一次並且只有在類被使用時才會執行類中的的靜態代碼塊;b.類在第一個被使用的時候才被裝載,而不是在程式啟動時就裝載程式中所有可能要用到的類。(2)單態類設計 首先我們瞭解下類的單態設計模式,即採取一定的方法保證在整個的軟體系統中,對某個類只能存在一個對象執行個體,並且該類只提供一個取得其對象執行個體的方法。//單態類class TestSingle { private TestSingle(){} //私人構造方法 private final static TestSingle single = new TestSingle(); //構造TestSingle一個私人執行個體對象 public static TestSingle getSingleInstance() //返回該私人對象 { return single; }}然後,我們在主線程中就可以通過TestSingle.getSingleInstance()方法來擷取該單態類唯一的對象。源碼:staticDemo.java
//單態類class TestSingle { private TestSingle(){}//私人構造方法 private final static TestSingle single = new TestSingle(); //構造TestSingle一個私人執行個體對象 public static TestSingle getSingleInstance()//返回該私人對象 { return single; } public void print() { System.out.println("I am TestSingle class"); }}//主類public class staticDemo{ public static void main(String[] args) { System.out.println("In main thread "); TestSingle single=TestSingle.getSingleInstance(); //建立單態類對象 single.print();//調用單態類中的公用方法 }}
列印資訊:
分析:如果要讓類在一個虛擬機器中智能產生一個對象,我們可以使用static去設計一個單態類a.首先必須將類的構造方法的存取權限設定為private,這樣的話就能能用new操作符在類的外部產生類的對象了,當然我們在類的內部仍然可以產生該類的對象。b.在單態類中使用new操作符產生一個執行個體對象,且該執行個體對象為靜態私人的,只能被本類的靜態方法使用c.由於我們無法在類的外部還無法得到該單態類的對象,所有我們在單態類中實現一個靜態方法用以返回該內部建立的對象。需要注意的是:靜態方法只能訪問類中的靜態成員變數哦。
3.使用static關鍵字注意事項(1)在靜態方法裡只能直接調用同類中其他的靜態成員(包括變數和方法),而不能直接存取類中的非靜態成員。因為對於非靜態方法和變數,需要先建立類的執行個體對象後才可使用,而靜態方法在使用前不用建立任何對象。(2)靜態方法不能以任何方法引用this和super關鍵字。因為靜態方法在使用前不用建立任何執行個體對象,當靜態方法被調用時this所引用的對象根本就沒有產生。(3)main()方法是靜態,隱藏JVM在執行main方法時不建立main方法所在的類的執行個體對象。因而在main()方法中,不能直接存取該類中的非靜態成員,必須建立該類的一個執行個體對象後,才能通過這個對象去訪問類中的非靜態成員。
二、final關鍵字 我們在編寫Java代碼時,時常看到在Java中聲明類、屬性和方法時,使用關鍵字final來修飾。下面我們就來學習下final關鍵字到底有些什麼作用?1.final標記的類是不能被繼承的;2.final標記的方法不能被子類重寫;3.final標記的變數,無論是成員變數還是局部變數,即成為常量,只能被賦值一次。另外,final標記的成員變數必須在聲明的同時或在該類的構造方法中顯示賦值後才能使用。class Test{ final int x=3;}或者:class Test{ final int x; Test() { x=3; }}注意:(1)final標記的變數(成員變數或局部變數)即成為常量,只能對其賦值依次,但這個"常量"也只能在這個類的內部使用,不能在類的外部直接使用。(2)在Java中定義常量,通常使用public static final來標記這個常量,然後這個常量就成了全域的常量。但是,這樣定義的常量只能在定義時賦值,即使在建構函式裡面也不能對其進行賦值。