final修飾的變數會在準備階段初始化嗎?
阿新 • • 發佈:2021-12-01
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