static與final的區別

2021-07-15 22:34:47 字數 1235 閱讀 9747

一、1、static變數

對於靜態變數在記憶體中只有乙個拷貝(節省記憶體),jvm只為靜態分配一次記憶體,在載入類的過程中完成靜態變數的記憶體分配,可用類名直接訪問(方便),當然也可以通過物件來訪問(但是這是不推薦的)。

對於例項變數,沒建立乙個例項,就會為例項變數分配一次記憶體,例項變數可以在記憶體中有多個拷貝,互不影響(靈活)。

public

class test

}class myclass

執行這段**就會發現,每次列印的兩個j值都是一樣的,而i的值卻是不同的。從這裡就可以知道final和static變數的區別了

2、靜態方法

靜態方法可以直接通過類名呼叫,任何的例項也都可以呼叫,因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的例項變數和例項方法(就是不帶static的成員變數和成員成員方法),只能訪問所屬類的靜態成員變數和成員方法。因為例項成員與特定的物件關聯!這個需要去理解,想明白其中的道理,不是記憶!!!

二、1、final類

final類不能被繼承,因此final類的成員方法沒有機會被覆蓋

,預設都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會載被擴充套件,那麼就設計為final類。

2、final方法

如果乙個類不允許其子類覆蓋某個方法,則可以把這個方法宣告為final方法。

使用final方法的原因有二:

第一、把方法鎖定,防止任何繼承類修改它的意義和實現。

第二、高效。編譯器在遇到呼叫final方法時候會轉入內嵌機制,大大提高執行效率。

3、final變數(常量)

(1)當final變數是基本資料型別以及string型別時,如果在編譯期間能知道它的確切值,則編譯器會把它當做編譯期常量使用。也就是說在用到該final變數的地方,相當於直接訪問的這個常量,不需要在執行時確定。

(2)引用變數被final修飾之後,雖然不能再指向其他物件,但是它指向的物件的內容是可變的。

特別要注意乙個問題

對於被static和final修飾過的例項常量,例項本身不能再改變了,但對於一些容器型別(比如,arraylist、hashmap)的例項變數,不可以改變容器變數本身,但可以修改容器中存放的物件,這一點在程式設計中用到很多。

final與static的區別於用法

final 修飾類,那麼這個類不能被繼承 修飾方法,那麼這個方法不能被override 修飾屬性,那麼這個屬性值不能被修改 static 表示為靜態成員 方法 屬性 靜態成員與非靜態成員的區別 靜態成員在物件建立之前就存在,呼叫方式 類.方法 類.屬性 非晶態成員,必須在建立物件之後才能使用,呼叫方...

Final和static的區別

首先 final 和static 是完全沒有關係的。final 作用 1.final 修飾屬性,表示屬性 只能賦值一次 1 基本型別 值不能被修改 2 引用型別 引用不可以被修改該。如 public final int rows 1 此時變數rows不管在什麼地方引用,都不能被再次賦值。但是,可以先...

static和final的區別

修飾變數 靜態變數隨著類載入時被完成初始化,記憶體只有乙個,且jvm也只會為他分配一次記憶體,所有類共享靜態變數。修飾方法 在類載入的時候就存在,不依賴任何例項。static方法必須實現,不能用abstract修飾。即abstract修飾的方法不可謂static。修飾 塊 在類載入完成之後就會執行靜...