final变量中的宏替换

源代码1:

public class Java15 {
    public static void main(String[] args) {
        String s1="疯狂java";
        String s2="疯狂"+"java";
        System.out.println(s1==s2);
        String str1="疯狂";
        String str2="java";
        String s3=str1+str2;
        System.out.println(s1==s3);
    }
}

运行结果:

源代码2:

public class Java15 {
    public static void main(String[] args) {
        String s1="疯狂java";
        String s2="疯狂"+"java";
        System.out.println(s1==s2);
        final String str1="疯狂";
        final String str2="java";
        String s3=str1+str2;
        System.out.println(s1==s3);
    }
}

运行结果:

源代码3:

public class Java15 {
    public static void main(String[] args) {
        String s1="疯狂java";
        String s2="疯狂"+"java";
        System.out.println(s1==s2);
        final String str1;
        str1="疯狂";
        final String str2;
        str2="java";
        String s3=str1+str2;
        System.out.println(s1==s3);
    }
}

运行结果:

1.变量在编译时是无法确定的,而常量(直接量在编译时)是确定的;则上面源代码1中s1,s2是可以确定的,它们都指向常量池中的疯狂java,所以s1=s2;而str1,str2由于是变量,它们是不可以确定的,则它们指向就不同了,所以,str2!=str2;

2.在源代码2中由于将str1,str2都用了final修饰,都将他们定义为了宏定义,所以str1,str2将不再是变量;

3.对于final实例变量而言,只有在定义该变量时指定初始值才会有宏变量的效果,由于源代码3中在定义时并没有初始化,所以没有初始化效果,所以此时str1,str2是未知量,所以str1!=str2.

时间: 2024-08-04 10:31:39

final变量中的宏替换的相关文章

word中利用宏替换标点标点全角与半角

Alt+F11,然后插入-模块: 复制下面代码到编辑窗口: Sub 半角标点符号转换为全角标点符号() '中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragraph, ChineseInterpunction() As Variant, EnglishInterpunction() As Variant Dim MyRange As Range, N As Byte '定义一个中文标点的数组对象 ChineseInterpunction = Array(".

Java基础-final变量和普通变量的区别

当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了. 那么final变量和普通变量到底有何区别呢?下面请看一个例子: public class Test { public static void main(String[] args) { String a = "hello2"; final String b = "he

【JAVA】在编译期可直接替换的final变量

一.满足以下三个条件,一个final变量就不再是一个变量,而是一个直接量. 使用final修饰符修饰. 在申明的时候就进行初始化 初始化的值在编译器就可以确定. 二.在什么情况下初始化的值在编译期是可以确定下来的? 被赋的表达式只是基本的算术表达式或字符串链接运算,没有访问普通变量,调用方法. package fianlFieldCase; public class Test { public static void main(String[] args) { final String str1

#和##在宏替换中的作用

摘自:http://blog.csdn.net/kingkai620/article/details/5905606 文/kingkaihttp://blog.csdn.net/haoel/archive/2009/05/18/4197010.aspx,其中的PUZZLE 4给出了一个关于宏的谜题.值得研究. [c-sharp] view plaincopy#include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g

字符串变量中转义符的替换方法

1.通常直接写的字符串中有转义符是前面加[@]就能解决: 如:string str = @"请确认数据有误!\r\n中断程序运行."; 这时实际存入str中的内容是"请确认数据有误!\\r\\n中断程序运行." 2.如果字符串变量中的内容中有直接携带了转义符给怎么替换? 如:假设str中已经存有"请确认数据有误!\r\n中断程序运行."的内容. 这时实际存入str中的内容中的\r和\n是已转义后的内容,不是"\r"或"

随笔⑨ java中的变量 --- 类变量(静态变量),final变量,成员变量,局部变量

java中的变量 --- 类变量(静态变量),final变量,成员变量,局部变量 ① 类变量(也叫静态变量)是类中独立于方法之外的变量,用static 修饰,静态变量随着类的加载而加载. ② final变量:用final关键字修饰,不能被修改.与static一起用可表示常量. ③ 成员变量(也叫"实例变量"."域"):也是类中独立于方法之外的变量,不过没有static修饰.可以不进行初始化,Java会自动进行初始化,如果是引用类型默认初始化为null,如果是基本类型

C语言中的宏

1.不带参数的宏定义:宏定义又称为宏代换.宏替换,简称“宏”.格式:#define 标识符 字符串其中的标识符就是所谓的符号常量,也称为“宏名”.预处理(预编译)工作也叫做宏展开:将宏名替换为字符串.掌握"宏"概念的关键是“换”.一切以换为前提.做任何事情之前先要换,准确理解之前就要“换”.即在对相关命令或语句的含义和功能作具体分析之前就要换:例:#define PI 3.1415926把程序中出现的PI全部换成3.1415926说明:(1)宏名一般用大写(2)使用宏可提高程序的通用性

C/C++中慎用宏(#define)

宏的定义在程序中是非常有用的,但是使用不当,就会给自身造成很大的困扰.通常这种困扰为:宏使用在计算方面. 本例子主要是在宏的计算方面,很多时候,大家都知道定义一个计算的宏,对于编译和编程是多么的有用.现在定义有以下一个计算 "乘法" 的宏. #include <stdio.h> #define MUL(a) ((a)*(a)*(a)) int main(int argc,char *argv[]) { int i = 10; int sum = MUL(i); printf

程序猿之---C语言细节28(const变量初始化、数组大小用const变量细节、const变量与#define宏、volatile修饰)

主要内容:const变量初始化.数组大小用const变量细节.const变量与#define宏.volatile修饰 一.const变量初始化时必须赋值 二.const变量在C++中可以做数组大小元素.在C中不行,因为它是变量 三.const和#define区别:内存分配 四.volatile修饰一些变量:易被操纵系统.硬件.多线程修改的变量 #include <stdio.h> int main() { /* 测试1 */ const int b; // 不初始化会报错 // b = 2;