static && final

研究問題:

  1. 兩者區別與使用範圍
  2. 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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章