首先很重要一点,转义字符是供编译器识别的。当java文件编译成.class文件后就不存在转义一说了。
比如,定义一个字符串String a值为双引号“。由于java的语法规定,字符串字面量是要由一对双引号括起来。如果这样定义String a = " " ";编译器肯定识别a为空字符串,后面不成对的双引号还会报错。这时候需要一个转义字符(java选择了\)来标识中间的双引号是字符串值,而不是语法中用来包裹字符串的特殊字符。而编译后的class文件保存值“到常量池中,不存在歧义的问题(具体可以看关于class文件讲解的文章)。
一。八进制转义序列:用于表示ascii中的字符
规则: \+1到3位8进制数字;范围'\000'~'\177'
编译器是会自动识别转义符号\后可用的数字。
比如:"\402" 超过了最大值177,编译器就会识别为改字符串为空格加上一个字符”2“,再比如”\092",9不在8进制数字中,编译器就是识别为\0和字符“92”
二。unicode转义字符:用于表示unicode字符集中的字符
规则:\u+4个十六进制数字;范围0~65535
必须要写全4个数字,即只能写\u0000而不能写\u0
三。特殊字符:单引号'、双引号"、反斜线\
java字符串定义中,双引号必须转义,即必须这样写:"\"";而单引号可不转义,即可以这样写" ' ";
相同的字符定义中,单引号必须转义,' \' ';双引号可不转义' " ';
反斜线不管作为字符还是字符串的值都需转义
四。控制字符
\r回车
\n换行
\f走纸换页
\t横向挑格
\b退格
这里需要注意,unicode转义字符和其他转义类型,转义的位置不同。如下句话说的:编译器在将程序解析成各种符号之前,先将Unicode转义字符转换成为它们所表示的字符。可以理解为编译器先将源文件中unicode转义字符转成对应字符再解析代码意义。也就是unicode转义字符只是字符的另一种写法,即\u0022(双引号)只改变u0022的字面含义,不改变它所代表的双引号的代码含义。
比如:
System.out.println("\u0022.length()+\u0022".length());
输出结果是0,输出内容等同"".length()+"".length()
System.out.println("\42.length()+\42".length());
System.out.println("\".length()+\"".length());
输出结果都是12
再比如
System.out.println("\42"); 输出“
System.out.println("\""); 输出”
System.out.println("\u0022"); 报“未结束字符串”错误