java操作符(1)

一、使用java操作符

    操作符接受一个或多个参数,并生成一个新值。参数的形式与普通的方法调用不同,但效果是相同的。加号和一元的正号(+)、减号和一元的负号(-)、乘号(*)、除号(/)以及赋值号(=)的用法与其他编程语言类似。

    操作符作用于操作数,生成一个新值。几乎所有的操作符都只能操作“基本类型”。例外的操作符是“=”、“==”和“!=”,这些操作符能操作所有的对象(这也是对象易令人糊涂的地方)。除此之外,String类支持“+”和“+=”。

二、优先级

    当一个表达式中存在多个操作符时,操作符的优先级就决定了各部分的计算顺序。java对计算顺序做了特别的规定。其中,最简单的规则就是先乘除后加减。程序员经常会忘记其他优先级规则,所以应该用括号明确规定计算顺序。例如:

public class Precedence {
	public static void main(String[] args) {
		int x=1, y=2, z=3;
		int a=x+y-2/2+z;
		int b=x+(y-2)/(2+z);
		System.out.println("a="+a+" b="+b);
	}
}

    这两个语句看起来大体相同,但是从输出就可以看出它们具有迥然不同的含义,而这正是使用括号的结果。

    请注意,System.out.println()语句中包含“+”操作符。这种上下文环境中,“+”意味着“字符串连接”,并且如果必要,他还要执行“字符串转换”。当编译器观察到一个String后面紧跟一个“+”,而这个“+”的后面又紧跟一个非String类型的元素时,就会尝试着将这个非String类型的元素转换为String。正如输出中所看到,它成功地将a和b从int转换为String了。

三、赋值

    赋值使用操作符“=”。它的意思是“取右边的值,把它赋值给左边”。右值可以是任何常数、变量或者表达式(只要它能生成一个值就行)。但左边必须是一个明确的、已命名的变量。也就是说,必须有一个物理空间可以存储等号右边的值。举例来说,可将一个常数赋给一个变量:a=4;

    但是不能把任何东西赋给一个常数,常数不能作为左值“比如:4=a”。

    对基本数据类型的赋值是很简单的。基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方。例如,对基本数据类型使用a=b,那么b的内容就复制给a。若接着又修改了a,而b根本不会受这种修改的影响。作为程序员,这正是大多数情况下我们所期望的。

    但是在为对象“赋值”的时候,情况却发生了变化。对一个对象进行操作时,我们真正操作的是对对象的引用。所以倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方。这意味着假若对对象使用c=d,那么c和d都指向原本只有d指向的那个对象。例如:

class Tank{
	int level;
}

public class Assignment {
	public static void main(String[] args) {
		Tank t1=new Tank();
		Tank t2=new Tank();
		t1.level=9;
		t2.level=47;
		System.out.println("1:t1.level="+t1.level+" t2.level="+t2.level);
		t1=t2;
		System.out.println("1:t1.level="+t1.level+" t2.level="+t2.level);
		t1.level=27;
		System.out.println("1:t1.level="+t1.level+" t2.level="+t2.level);
	}
}

    Tank类非常简单,它的两个实例(t1和t2)是在main()里创建的。对每个Tank类对象的level域都赋予了一个不同的值,然后将t2赋给t1,接着又修改了t1。在许多编程语言中,我们可能会期望t1和t2总是相互独立的。但由于赋值操作的是一个对象的引用,所以修改t1的同时也改变了t2。这是由于t1和t2包含的是相同的引用,它们指向相同的对象。(原本t1所包含的对对象的引用,是指向一个值为9的对象。在对t1赋值的时候,这个引用被覆盖,也就是丢失了;而那个不再被引用的对象会由“垃圾回收器”自动清理。)这种特殊的现象通常称作“别名现象”,是java操作对象的一种基本方式。

四、方法中调用的别名问题

    将一个对象传递给方法时,也会产生别名问题:

class Letter{
	char c;
}

public class PassObject {
	
	static void f(Letter y) {
		y.c='z';
	}
	
	public static void main(String[] args) {
		Letter x=new Letter();
		x.c='x';
		System.out.println("1:x.c="+x.c);
		f(x);
		System.out.println("2:x.c="+x.c);
	}
}

    在许多编程语言中,方法f()似乎要在它的作用域内复制其参数Letter y的一个副本;但实际上只是传递了一个引用。所以代码行:y.c=‘z’;实际改变的是f()之外的对象。

五、算术操作符

    java的基本算术操作符与其他大多数程序设计语言是相同的。其中包括加号(+)、减号(-)、除号(/)、乘号(*)以及取模操作符(%,它从整数除法中产生余数)。整数除法会直接去掉结果的小数位,而不是四舍五入地圆整结果。

    java也使用一种来自C和C++的简化符号同时进行运算与赋值操作。这用操作符后紧跟一个等号来表示,它对于java中的所有操作符都适用,只要其有实际意义就行。例如,要将x+4,并将结果赋回给x,可以这么写:x+=4。

import java.util.Random;

public class MathOps {
	public static void main(String[] args) {
		Random rand=new Random(50);
		int i,j,k;
		j=rand.nextInt(100)+1;
		System.out.println(j);
		k=rand.nextInt(100)+1;
		System.out.println(k);
		i=j+k;
		System.out.println(i);
		i=j-k;
		System.out.println(i);
		i=j*k;
		System.out.println(i);
		i=j/k;
		System.out.println(i);
		i=j%k;
		System.out.println(i);
	}
}

    要生成数字,程序首先会创建一个Random类的对象。如果在创建过程中没有传递任何参数,那么java就会将当前时间作为随机数生成器的种子,并由此在程序每一次执行时都产生不同的输出。通过Random类的对象,程序可生成许多不同类型的随机数字。做法很简单,只需调用方法nextInt()和nextFloat()即可(也可以调用nextLong()或者nextDouble())。传递给nextInt()的参数设置了所产生的随机数的上限,而其下限是0,但是这个下限并不是我们想要的,因为它会产生除0的可能性,因此我们对结果做了加1操作。

六、一元加、减操作符

    一元加号(-)和一元加号(+)与二元减号和加号都使用相同的符号。根据表达式的书写形式,编译器会自动判断出使用的是哪一种。例如语句:x= -a;的含义是显然的。编译器能正确识别下述语句:x= a * -b;但有时会搞糊涂,所以有时更明确的写成:x = a * (-b);

    一元减号用于转变数据的符号,而一元加号只是为了与一元减号相对应,但是它唯一的作用仅仅是将较小类型得操作数提升为int。

七、自动递增和递减

    java提供了大量的快捷运算。这些快捷运算使编码更方便,同时也使得代码更容易阅读,但是有时可能使代码阅读起来更困难。

    递增和递减运算是两种相当不错的快捷运算(常称为自动递增和自动递减运算)。其中,递减操作符是“--”,意为减少一个单位;递增操作符是“++”,意为增加一个单位。举个例子来说,假设a是一个int(整数)值,则表达式++a就等价于(a=a+1)。递增和递减操作符不仅改变了变量,并且以变量的值作为生成的结果。

    这两个操作符各有两种使用方式,通常称为“前缀式”和“后缀式”。“前缀递增”表示“++”操作符位于变量或表达式的前面;而“后缀递增”表示“++”操作符位于变量或表达式的后面。递减也是同理。对于前缀递增和前缀递减(如:++a或--a)会先执行运算,在生成值。而对于后缀递增和后缀递减(如:a++或a--),会先生成值,再执行运算。

    

public class AutoInc {
	public static void main(String[] args) {
		int i = 1;
		System.out.println("i:" + i);
		System.out.println("i:" + ++i);
		System.out.println("i:" + i++);
		System.out.println("i:" + --i);
		System.out.println("i:" + i--);
		System.out.println("i:" + i);
	}
}

    从中可以看到,对于前缀形式,我们在执行完运算后才得到值。但对于后缀形式,则是在运算执行之前就得到值。

发布了72 篇原创文章 · 获赞 2 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 我行我“速” 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览