1. 程式人生 > 其它 >final修飾的變數會在準備階段初始化嗎?

final修飾的變數會在準備階段初始化嗎?

1、首先final修飾成員變數(final單獨修飾不和static一起使用)是在例項初始化的時候被賦值的。這個和非final修飾成員變數賦值時機沒有什麼不同,只不過final修飾的不能多次賦值罷了。

2、final static修飾的成員變數只有在其型別為ConstantValue時才會在準備階段被賦予具體值(而不是型別的預設值)。

3、ConstantValue需要滿足2個條件

  • 型別為基本型別或者String
  • 此型別被賦值時只能使用字面量而不是方法的形式

4、舉例

  • final static int a = 1;//準備階段賦值-基本型別可以轉化為ConstantValue,且使用的是字面量賦值。
  • final static int a = getA();//初始化階段賦值-基本型別可以轉化為ConstantValue,但賦值不是使用字面量。
  • final static String b = "abc";//準備階段賦值-String可以轉化為ConstantValue,且使用的是字面量賦值。
  • final static String b= getB();//初始化階段賦值-String可以轉化為ConstantValue,但賦值不是使用字面量。
  • final static Object c = new Object();//初始化階階段賦值-其他型別不可以轉化為ConstantValue
  • final static Object c= new Object();//初始化階階段賦值-其他型別不可以轉化為ConstantValue