java -- static/final/abstract

#1.static
當一個方法或者變量須要初始化時被加載,或者是常常被調用的時候,可使用static修飾它們。 弊處是:初始化被加載,比較佔用內存。
java語言中沒有 全局變量 這個概念,可使用static表示"全局變量(或方法)",由於被static修飾的變量/方法不依賴於任何類的實例,它被全部類的實例共享。java

static修飾符能夠與 變量、方法、類(內部類)一塊兒使用,表示"靜態"的。
靜態變量/方法經過 類名 來訪問,所以它們也被稱做類變量/類方法。
實例變量/方法須要經過類的實例來訪問。
##1.靜態變量 靜態變量屬於類,不是對象,所以無需建立類的實例就能夠訪問它。編譯器只會給靜態變量分配一個內存空間,雖然會有多個實例(類每調用一次),但這些實例共享該內存。實例變量則不一樣,每建立一個對象,都會被分配一次內存空間,不一樣實例之間的內存相互獨立,互不影響,改變a的實例變量不會影響b的實例變量。
static修飾的變量在類加載的時候就會被初始化,也就是說,只要類被加載,無論是否用了這個static變量,它都會被初始化。之後在生成類的實例(類名.變量)時,將共享這個變量,任何一個對象修改 靜態變量,都會影響其餘類對它的使用。多線程

靜態變量與實例變量的區別
1.靜態變量須要被static修飾,實例變量不須要。
2.靜態變量只會被加載一次,即只分配一次內存,能夠用類名直接訪問,全部的類均可以操做靜態變量,所以靜態變量的值可能會被各個類修改,即全部的類共享該變量;對於屬性變量,沒建立一個實例,都會爲該實例的屬性分配一次內存,所以各個實例的屬性之間互不影響,即修改了實例A的cc屬性不會影響實例B的cc屬性(備註:實例A與實例B同屬於一個類)。
3.靜態變量使用場景
1>各個對象之間共享該變量(多線程)
2>常常須要訪問該變量
##2.靜態方法
1.靜態方法同靜態變量同樣,也是被各個類的實例共享。所以,靜態方法中不能出現this與super關鍵字。
2.靜態方法不能操做它所屬類的非靜態變量。
靜態方法使用場景:
1.一個方法不須要操做對象,其所需參數都是顯式參數提供(例如:Math.pow())。
2.一個方法只須要訪問類的靜態變量。this

static和final組合使用
static與final組合修飾的變量/方法/類,能夠理解爲"全局常量/方法/類"。
很明顯,static修飾的變量能夠被全部類的實例使用,所以表示"全局";final修飾的變量值不能夠被改變,所以表示"常量"。
static final變量:表示該變量一旦給定值,就不能夠修改。
static final方法:表示該方法不能夠被覆蓋,即不能被重寫。
static final類:該類是一個內部類,該類不能被繼承。線程

#2.final
final能夠修飾類、方法、變量。表示「最終」的意思。
1.final修飾的類不能被繼承
2.final修飾的方法不能被子類重寫
3.final修飾的變量,即爲常量,只能被賦值一次對象

#3.abstract
抽象修飾符,它能夠修飾類和方法。
abstract修飾類:使這個類變成一個抽象類,即這個類不能實例化對象。它須要被子類繼承,並實現其方法。
abstract修飾方法:使這個方法變成抽象方法,即該方法只有聲明沒有實現,須要在子類中實現。
備註:
1.存在抽象方法的類必定是抽象類;反過來,抽象類中不必定所有都是抽象方法,它能夠有實現的方法。
2.子類繼承抽象類後,若是須要實例化對象,則該子類必需要實現父類全部的方法;不然,該子類也必須是抽象類(即子類若是沒有徹底覆寫抽象父類的方法,蓋子類也必須是抽象類;只有徹底覆寫了,該子類才能夠實例化對象)。繼承

相關文章
相關標籤/搜索