在最底层,Java中的数据是通过使用操作符来操作的。Java是建立在C++基础上的,所以C和C++程序员应该非常熟悉Java的大多数操作符。当然,Java也做了也一些改进和简化
1)简单的打印语句
System.out.println("Hello java world!");
2)使用Java操作符
操作符接受一个或多个参数,并生成一个新的值。参数的形式与普通的方法调用不同,但效果是相同的。加号和一元的正号(+)、减号和一元的负号(-)、乘号(*)、除号(/)以及赋值号(=)的用法和其他编程语言类似。
操作符作用于操作数,生成一个新的值。另外,有些操作符可能会改变操作数自身的值,这些被称为“副作用”。那些能改变其操作数的操作符,最普遍的用途就是用来产生副作用;但要记住,使用此类操作符生成的值,与使用没有副作用的操作符生成的值,没有什么区别。
几乎所有的操作符都只能操作基本类型,但是也有例外的地方。例外的操作符是“=”、“==”、“!=”,这些操作符能操作所有对象(这个也是对象令人难以理解的地方)。除此之外,String类支持“+”和“+=”操作符。
3)优先级
当一个表达式中存在多个操作符的时候,就会存在谁优先执行的问题了。操作符的优先级就决定了各部分的计算顺序。Java对计算顺序做了特别的规定。其中,最简单的规则就是先乘除后加减。如果会忘记其他优先级规则,可以直接用括号明确规定计算顺序。例如以下代码中的(1)和(2):
public class Test {
public static void main(String[] args) {
int x = 1;
int y = 2;
int z = 3;
int a = x + y - 2 / 2 + z;//(1)语句
int b = x + (y - 2) / (2 + z);//(2)语句
System.out.print("a = " + a + "; b = " + b);
}
}
输出结果:a=5;b=1
上面两个语句看起来好像没有什么区别,但是从输出结果就可以看出他们是具有不同的含义,而正是使用括号的结果。
请注意:System.out.print()
语句中包含“+”操作符。在这种上下文环境中,“+”意味着“字符串连接”,并且如果必要,它还要执行“字符串转换”。当编译器观察到一个String
后面紧跟着一个“+”操作符,而这个“+”的后面又紧跟一个非String
类型的元素时候,就会尝试着将这个非String
类型的元素转换为String
。正如输出结果那样,它成功地将a和b从int
转换成String
了。
4)赋值
赋值使用操作符“=”。它的意思是“取右边的值(即右值),把它复制给左边的值(即左值)”。右值可以是任何常数、变量或者表达式(只要它能生成一个值就行了)。但是左值必须是一个明确的、已经命名的变量。也就是说,必须有一个物理空间可以存储等号右边的值。举例来说,可以将一个常数赋给一个变量:a = 4;
但是不能把任何东西赋给一个常数,常数不能作为左值(比如不能说4 = a;
)。
对基本数据类型赋值是很简单的。基本类型存储了实际的数值,而非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到另外一个地方。例如,对基本数据类型使用a = b;
,那么b的内容就复制给a了。若接着又修改了a,而b根本不会受这种修改的影响。
但是在为对象“赋值”的时候,情况却发生了变化。对一个对象进行操作时候,我们真正操作的是对对象的引用。所以倘若“将一个对象赋值给另外一个对象”,实际上是将“引用”从一个地方复制到另外一个地方。这意味着假若对对象使用c = d;
,那么c和d都指向原本只有d指向的那个对象。我们下面撸一个例子来验证一下:
public class Test {
public static void main(String[] args) {
tank1.level=9;
tank2.level=47;
System.out.println("1: tank1.level = "+tank1.level+" ;tank2.level = "+tank2.level);
tank1=tank2;
System.out.println("2: tank1.level = "+tank1.level+" ;tank2.level = "+tank2.level);
tank1.level=27;
System.out.println("3: tank1.level = "+tank1.level+" ;tank2.level = "+tank2.level);
}
static class Tank {
int level;
}
}
输出结果:
1: tank1.level = 9 ;tank2.level = 47
2: tank1.level = 47 ;tank2.level = 47
3: tank1.level = 27 ;tank2.level = 27
Tank类非常简单,它的两个实例(t1
和t2
)分别在main()
里创建,对每个Tank
类对象的level
域都赋予了一个不同的值,然后,将t2
赋给t1
,接着又修改了t1
。在许多编程语言中,我们可能会期望t1
和t2
总是相互独立的。但由于赋值操作的是一个对象的引用,所以修改t1
的同时也改变了t2
!这是由于t1
和t2
包含的是相同的引用,它们指向相同的对象。(原本t1
包含的对对象的引用,是指向一个值为9的对象。在对t1
赋值的时候,这个引用被覆盖了,也就是丢失了;而那个不在被引用的对象会由“垃圾回收器”自动清理。)
网友评论