java final static

final:

  1. 修飾類:類不能被繼承
  2. 修飾方法:方法不能被重寫
  3. 修飾變量:不能修改變量的指向,且只能賦值一次
    1. 全局變量是有默認值的,所以如果用final修飾全局變量,能在定義的同時賦值,或在構造函數中賦值(注意,其他方法不能給final全局變量賦值,會報錯)
    2. 局部變量不會默認賦值,因此如果用final修飾,可以初始化一次
    3. 注意:final變量是不能修改指向(即地址),但不代表不能改值,引用類型的話是可以改值的

代碼:

1.賦值問題

final變量可以在構造函數內賦值,這個特性可能會使人疑惑。

因爲全局變量是會默認賦值的,並且這個賦值操作是先於構造函數執行的,

所以可以在構造函數中賦值看起來似乎是不可能的。

但這確實是可以的,但也只能是構造函數,其他方法並不行。

這是因爲Java有一個“空白final”的東西,"空白final"指的是被申明final但未給初值的域。

此外,Java還規定空白final在使用之前必須初始化。

二者兼和,就出現了上面所說的特殊情況

eg.

class  Test{

    final int m =3;//,正常初始化,並賦值爲3,不存在“空白final”
    
    final int  n; //正常初始化,並初始化爲“空白final”
    
    Test(){
        
        n = 3; // “空白final”被賦值爲3

    }


    /*
      
     * 注意,在非構造方法內給”空白final“賦值是非法的
     
     *  final int error ;
    
     *  void show(){
        
     *      error = 3; 這是會報錯的            

     *   }
    
}

 

2.改值問題

calss Test1{

    final int m =3; //基本數據類型,m裏面存放的是常量3的地址,所以m的值是無法改變的

    final Test2 test2;


    Test1(){

        test = new Test2();
        
        test.m = 4; //合法

        test.n = 8; //合法

        test  = new Test2();//不合法,test不能指向新的地址

    }

}

class Test2{

    int m = 3;
    
    int n= 6;

}

 


 

static 方法


“static方法就是沒有this的方法。在static方法內部不能調用非靜態方法,反過來是可以的。而且可以在沒有創建任何對象的前提下,僅僅通過類本身來調用static方法。這實際上正是static方法的主要用途。”

  • static在對象存在前就存在(不是類存在前)
  • static不能訪問非靜態方法和變量,反之可以
  • static方法無法使用this,應爲不存在對象

static變量


  • static成員變量的初始化順序按照定義的順序進行初始化。

  • 靜態變量被所有的對象所共享,在內存中只有一個副本,它當且僅當在類初次加載時會被初始化

static代碼塊 


static關鍵字還有一個比較關鍵的作用就是 用來形成靜態代碼塊以優化程序性能。static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被加載的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。

優化前,每次創建兩個對象

class Person{
    private Date birthDate;
     
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
     
    boolean isBornBoomer() {
        Date startDate = Date.valueOf("1946");
        Date endDate = Date.valueOf("1964");
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }
}

優化後,只需創建一個

class Person{
    private Date birthDate;
    private static Date startDate,endDate;
    static{
        startDate = Date.valueOf("1946");
        endDate = Date.valueOf("1964");
    }
     
    public Person(Date birthDate) {
        this.birthDate = birthDate;
    }
     
    boolean isBornBoomer() {
        return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0;
    }
}

注意:

 class staticTest{
static int a=47;
static String[] s = new String[10];

}

staticTest t1 = new staticTest();
staticTest t2 = new staticTest();

t1.a和t2.a是同一個,不是兩個
t1.s和t2.s是也是同一個,不是兩個

static final

 

  • java中的常量
  • 變量名全部大寫()
  • 必須在申明的同時賦值
  • 由類名.訪問
  • 在編譯時自動替換,效率高
  • 不可改變
public static final double PI = 3.1415926;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章