字符,从字面理解,就是一些char型的东东,然而放到程序里,就引申出了多种解读方式
1、转义字符
在程序中,转义字符何时被编译器解读呢?它的解读时刻可以理解成在编译之前,编译器先进行转义字符的替换。
比如下面的程序段:
(a)//\u0022是"
System.out.println("a\u0022.length()+\u0022b".length);
打印2
(b)有一行注释是:/*from F:/a/b/c/unit*/
这是合法的吗?注意编译器查找到\u会认为后面接的是unicode码,而注释之后没有跟四位数字,那么编译器会拒绝编译
万变不离其宗,阅读程序时,注意到转义的Unicode码,然后将其转换再编译。
提示:不要随便使用Unicode的转义字符,除非迫不得已
2、正则表达式的特殊字符
这是关于正则表达式的理解.
string.replaceAll支持正则表达式,因此在使用这个函数时要主要到。
如:已有一个类com.javapluzzlers.Me
Me.class.getName().replaceAll(".","/")+".class";
替换后会是com/javapluzzlers/Me.class吗?
运行后发现不是。因为“.”在正则里表示匹配任意的字符,替换后会是一串/////////////.class,
3、URL
由于java支持标签,那么如果再程序段存在一条http://blog.csdn.net这样的语句,那么这个程序段会被编译吗?答案是会的。
因为http:被理解为标签,而//blog.csdn.net被理解为注释,显然不存在任何语法错误。
4、参数字符
考察下StringBuffer。
StringBuffer sf = new StringBuffer(‘M‘);
sf.add("a");
System.out.println(sf);
打印什么?会是Ma吗。
查看API会发现,StringBuffer并不存在参数为char的构造函数,但是存在参数为int 的构造函数,因此声明语句实际是声明了一个容量是’M‘(77)大小的buffer。
原文地址:http://blog.csdn.net/havedream_one/article/details/45037033