研究問題:
- 兩者區別與使用範圍
- static內存圖解
要點:
- final定義一個常量,不能被改變。且定義的方法不能被繼承。
- final static定義一個全局靜態常量,不可改變
- 在靜態方法中一定不能調用非靜態成員,但在非靜態方法中可以調用靜態成員Static和finanl區別:
一、static :
什麼情況下我們要使用static呢?
1、只想用一個存儲區域來保存一個特定的數據——無論要創建多少個對象,甚至根本不創 建對象。
2、我們需要一個特殊的方法,它沒有與這個類的任何對象關聯。也就是說,即使沒有創建對象,也需要一個能調用的方法。
爲滿足這兩方面的要求,可使用static(靜態)關鍵字。
下面我先舉個例子:
一旦將什麼東西設爲static,數據或方法就不會同那個類的任何對象實例聯繫到一起。所以儘管從未創建那個類的一個對象,仍能調用一個static方法,或訪問一些static數據。
爲了將數據成員或方法設爲static,只需在定義前置和這個關鍵字即可。
二、final:
final可修飾類、域(變量和常量)、方法 (而static不修飾類)
1、final修飾類,表示該類不可被繼承。
2、final修飾變量
程序中經常需要定義各種類型的常量,如:3.24268,”201”等等。這時候我們就用final來修飾一個類似於標誌符名字。
3、修飾方法:
final修飾的方法,稱爲最終方法。最終方法不可被子類重新定義,即不可被覆蓋。
如父類定義了public void fly(){ ….}
則子類就不能定義
public void fly(){。。。。。。}
但注意覆蓋與重載的區別。不能被覆蓋並不是不能被重載,如你還可以定義
public void fly(int i){…..}, - static內存圖解
- Static
類中定義了實例變量ia和靜態變量sa,並初始化10和20,在主類的主方法中通過StaticAttribute類的對象fun1將ia和sa值改爲100,1000;同理,fun2將ia和sa值改爲200,2000;由於sa爲靜態變量,屬於整個類,只有有一個對象改變了它的值,所有的對象對應的sa的值都會發生變化,因此fun1、fun2以及StaticAttribute引用的sa得到的值都是2000。
-
- 易錯點:沒有區分構造方法與靜態初始化器在內存中的位置
構造方法—-方法區。
靜態初始化器—-靜態初始化器與類構造方法對靜態變量sn進行初始化,利用構造方法改變sn的值,再把sn的值給非靜態變量n。靜態初始化器是在它所屬的類加載到內存時由系統調用執行,而構造方法是在系統用new運算符產生新對象時自動執行,每執行一次都要對構造方法進行操作。
- final
由於採用不同的初始化形式,fi2值保持不變。而fi1通過構造方法每次遞增1。