JAVA中的宏

在java中,被final关键字修饰的变量,且设置了初始值,那么这个值在编译阶段就已经确定了值,则这个变量就是“宏变量”,编译器会把用到该变量的地方全部都替换成设置好的那个值。简单点说就是“被final关键字修饰且给了初始值的变量就是宏变量”。

下面看一个例子:

 @Test
    public void test2() {
        String s1="java";
        String s2="ja"+"va";
        System.out.println(s1==s2);
        String str1="ja";
        String str2="va";
        String s3=str1+str2;
        System.out.println(s1==s3);
    }

输出结果:

true

false

dubug截图:


可以看到s1和s3确实不等。简单分析一下:

s1=“java”,“java”是字符串常量,我们知道是放在常量池中。s2="ja"+"va",会先去常量池中找是否存在“java”这个字符串,如果存在会把s2指向“java”的地址,所以s1和s2指向同一个地址,也就相等了。而s3=str1+str2是两个普通变量运算,编译器不执行宏替换,所以不相等。

下面用final修饰str1和str2

@Test
    public void test2() {
        String s1="java";
        String s2="ja"+"va";
        System.out.println(s1==s2);
        final String str1="ja";
        final String str2="va";
        String s3=str1+str2;
        System.out.println(s1==s3);
    }

输出结果:

true

true


我们可以看到s1和s2相等,被final修饰后,str1就会被替换为“ja”,str2会被替换为“va”,所以s3=str1+str2等价于s3="ja"+"va",所以s1和s3相等。

猜你喜欢

转载自blog.csdn.net/dam454450872/article/details/80523555