02 December 2013

最近看了一篇博客,谈到了“专注”,突然发现自己与博主很相似,都是东学一点西学一点,似乎什么都懂,其实相当于什么都不懂。思考良久,觉得还是要专注于几项技术,长期的学习和实践,至于其他的,权且算作业余的学习吧。


今天说说操作符,对于绝大多数语言,操作符都具有极大的相似性,今天只简单的列出一些Java中比较特别的用法和需要注意的地方。

赋值


赋值仅仅说需要注意的一点,假设类中定义了一个变量(number),我们创建该类的两个引用(t1和t2),假设我们执行下面的操作:

t1 = t2;

此时相当于将t1与t2绑定到一起(而不是简单赋值),即后面再修改t2的number,t1的number会一起变化。如果希望两个引用的number各自独立,则:

t1.number = t2.number;

此时,两者不是绑定的,赋值后再各自改变则是独立变化。

算术操作符


由于Java中都是“有符号型”的基本类型,则对于基本类型,有时我们会进行“取负”处理,Java是可以自动识别“-”,“+”什么时候为一元操作符,什么时候为二元操作符。

x = a * -b;

这里显然是一元的,此时写为如下形式更易读:

x = a * (-b);

一元“+”只是为了和一元“—”相对应,唯一的作用是将较小类型的操作数提示为int。

关系操作符


Java中要注意,“==”和“!=”是用来比较对象的引用,而不是实际的内容。如果要比较实际内容,可以使用equals()方法来处理:

n1.equals(n2);

对于基本类型,可以使用“==”和“!=”来直接比较内容。

逻辑操作符


个人觉得Java的逻辑操作符很好用,减少了很多编程中可能出现的错误。“与”“或”“非”与C/C++相同,对应“&&”“||”“!”,但是最大的区别在于,操作符操作的数据类型必须是布尔型。这里要说,Java的布尔型是一种特殊的类型,不同于有些语言使用整型来替代布尔型,Java布尔型是专用的,只有true和false两种可能(布尔值不能使用相加等其他操作)。举个例子:

int i, j, m, n;
(i > j) || (m > n); //ok
i || j; //wrong

第一种用法是正确的,由于两边都是布尔型,而第二种两边都是整型,故错误。别小看这个似乎用途很少的布尔型,它能避免很多错误。

回想一下,有多少次把if语句(while等)中的判断条件由“==”写成了“=”而导致了错误(但是编译器又没有提示错误),而这种错误由于思维惯性又难以察觉。在Java中,这些判断条件要求返回的是布尔值,即“=”不会返回布尔值,而“==”才会返回。也就是说,下次你再写错时,程序会提示错误,而不是当做“真”而执行下去。

字符串操作符


需要注意Java没有提供操作符重载,别想着自己定义这些符号了。对于字符串操作符“+”和“+=”,Java将符号两侧的数据类型转换为字符串型,并拼接到一起:

String s = "ok:";
int x = 0;
System.out.println(s + x);

打印结果为:

ok:0

解释一种特殊的情况:

int a;
System.out.println("f(" + a + ")");

如果希望打印的f()函数中是对应的整型值,则可以使用上面的方法。



blog comments powered by Disqus