public static final String BACE_INFO = "baseinfo";首先,先明确一下,
public class FinalInstanceTest{ //定义变量时初始化 final int var1 = 2; final String var2; final double var3; //非静态初始化代码块 { var2 = "吃饭睡觉打豆豆"; } //构造器中初始化 public FinalInstanceTest(){ this.var3 = 3.14; } }
可是本质上final实例变量的初始化都是在构造器中进行的。
5. final修饰的类变量也必须在定义时或静态初始化块中显式初始化,而本质上都是在静态初始化块中进行的。
咱们着重看如下final修饰的字符串,小伙伴们判断一下下面程序的输出结果 java
public static void main(String[] args) { String str1 = "javacode"; String str2 = "java" + "code"; System.out.println(str1 == str2); ------------------A String str3 = "java"; String str4 = "code"; String str5 = str3 + str4; System.out.println(str1 == str5); ------------------B }
public static void main(String[] args) { String str1 = "javacode"; String str2 = "java" + "code"; System.out.println(str1 == str2); ------------------A final String str3 = "java"; final String str4 = "code"; String str5 = str3 + str4; System.out.println(str1 == str5); ------------------B }这时B处将输出true。 事实上final修饰的变量已经成为一个直接替换量(这是我本身起的名字),当后续代码再次用到这个变量时,系统会自动将其替换成相应的值,所以 String str5 = str3 + str4;至关于 String str5 = "java"+"code";str5也就能够编译时肯定了。此外相对于实例变量而言,在定义时赋初始值,非静态初始化块中,构造器中赋初始值都是同样的,都将在构造器中执行,可是对于final变量只有在定义时赋初始值才会被直接替换。 另外关于final修饰的方法,主要强调在继承中存在的问题。被final修饰的方法子类不能重写,并且实际上子类也没法访问到父类中final修饰的方法。