Java final修饰的变量

来源:互联网 发布:合成照片软件app 编辑:程序博客网 时间:2024/05/21 14:52

看到这个帖子

http://bbs.csdn.net/topics/390706923?page=1#post-396731885


我试了下下面这个程序

public class ceshi {    public static final String A = "ab";    public static final String B = "cd";    public static String C = "ab";    public static String D = "cd";    public static void main(String[] args) {        String s = A + B;        String t = "abcd";        String a = C + D;                final String E = "ab";        final String F = "cd";        String b = E + F;                System.out.println(s == t);        System.out.println(t == a);        System.out.println(b == t);    }}

输出

说明final修饰的变量会在编译的时候被当成常量处理。


再看帖子中奇葩的第二个例子

public class ceshi2 {    public static final String A;    public static final String B;    static {        A = "ab";        B = "cd";    }    public static void main(String[] args) {        String s = A + B;        String t = "abcd";        System.out.println(s == t);    }}
输出


为什么final不起作用了呢?

我的理解是这样的:
第一个例子输出为true,是因为第一种写法在编译期间就可以确定String s的值了,因为A,B都是用final修饰的。所以String s会放到常量池
而第二个例子中A,B都是放在静态初始化块中的,静态初始化块是当这个类第一次被JVM加载的时候执行的。
而第一次被JVM加载是运行时的时候了,所以不会放到常量池中。所以为false.


0 0
原创粉丝点击