在最底层,Java中的数据是经过操做符来操做的。java
+
,-
,*
,*
,=
与其余语言相似=
,==
,!=
是例外+
和+=
操做符,表示拼接操做,在进行拼接的操做会尝试将非 String 的元素转换为 String(调用tostring())=
的左边(左值)必须是一个明确的已命名的变量。在为对象“赋值”时,其实质是拷贝“引用”,须要注意“别名现象”编程
package com.company.ch03; class Tank { int level; } public class Assignment { public static void main(String[] args) { Tank tank1 = new Tank(); Tank tank2 = new Tank(); tank1.level = 12; tank2.level = 13; System.out.println("tank1 = " + tank1.level); System.out.println("tank2 = " + tank2.level); tank1 = tank2; tank1.level++; System.out.println("tank1 = " + tank1.level); System.out.println("tank2 = " + tank2.level); } } //tank1 = 12 //tank2 = 13 //tank1 = 14 //tank2 = 14
package com.company.ch03; 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 = 'a'; System.out.println("x.c = " + x.c); // a f(x); System.out.println("x.c = " + x.c); // z } }
无论是那种别名问题,关键是要理解到拷贝的是引用,不是对象。函数
关系操做符与 C++ 也是相似,有一点比较特殊的是在 Java 中==
和!=
能够用在对象上,其比较的是引用,而不是对象内的值,若是要比较两个对象是否相等(语义上),一般调用equals
函数来比较。code
Integer n1 = new Integer(47); Integer n2 = new Integer(47); n1 == n2; // false n1.equals(n2); // true
equals
默认是比较引用,因此在本身实现的类中须要覆盖equals
方法才能进行语义上的比较对象
&&
,||
和!
操做只能用于布尔值,与C++不一样,对一个非布尔值进行逻辑运算不会对该值强制转换,会报编译错误blog
Java中的逻辑操做符也有“短路”现象字符串
0x/0X
前缀+0-9
和a-f
0
前缀+0-8
l/L
表示long
类型f/F
表示float
类型d/D
表示double
类型1.39E-43
表示$1.39 \times e^{-43}$>>
符号扩展,>>>
0扩展boolean-exp ? value0 : value1get
+
和+=
+
和+=
表示“拼接”操做**类型转换(cast
)**是指,在适当的时候,Java 会将一种数据类型自动转换为另外一种。string
显式的类型转换以下:编译
int i = 200; long l = (long)i; int j = (int)l;
java.lang.Math.round()
一个表达式中出现的最大的数据类型决定了该表达式最终结果的数据类型,如 int 类型与 long 类型相加,获得一个 long 类型。
因为Java中全部基本数据类型的大小都是明确的,因此不须要sizeof。BTW,boolean 不是没有明确嘛。
本文首发于Code & Fun