赋值
基本类型的赋值都是直接的。
如果是对象赋值,对一个对象进行操作时,实际上操作的是它的引用。例如:
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("2: t1.level: " + t1.level +
", t2.level: " + t2.level);
t1.level = 27;
System.out.println("3: t1.level: " + t1.level +
", t2.level: " + t2.level);
}
}
输出结果:
1: t1.level: 9, t2.level: 47
2: t1.level: 47, t2.level: 47
3: t1.level: 27, t2.level: 27
注意最后一行全部为27,因为操作t1.level = 27将level改变了,所以t2.level也是27。因为 t1 和 t2 此时指向的是堆中同一个对象。
递增和递减
和C语言类似,前递增和前递减(如 ++a 或 --a),会先执行递增/减运算,再返回值。而对于后递增和后递减(如 a++ 或 a–),会先返回值,再执行递增/减运算。代码示例:
// operators/AutoInc.java
// 演示 ++ 和 -- 运算符
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--); // 后递减
System.out.println("i: " + i);
}
}
输出结果:
i: 1
++i: 2
i++: 2
i: 3
--i: 2
i--: 2
i: 1
判断等价
用”==“
表达式 System.out.println(n1 == n2)
将会输出比较的结果。相同:输出 true,不同:输出 false。
用equals()
例如:n1.equals(n2)
public class EqualsMethod {
public static void main(String[] args) {
Integer n1 = 47;
Integer n2 = 47;
System.out.println(n1.equals(n2));
}
}
输出:
true
但其实事情并非那么简单。下面我们来创建自己的类:
class Value {
int i;
}
public class EqualsMethod2 {
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
System.out.println(v1.equals(v2));
}
}
输出结果:
false
原因: equals()
的默认行为是比较对象的引用****而非具体内容。因此,除非你在新类中覆写 equals()
方法,否则我们将获取不到想要的结果。
逻辑运算中的短路
逻辑运算符支持一种称为“短路”(short-circuiting)的现象。整个表达式会在运算到可以明确结果时就停止并返回结果,这意味着该逻辑表达式的后半部分不会被执行到。
字面值常量
Long 型数值:结尾使用大写 L 或小写 l 皆可(不推荐使用 l,因为容易与阿拉伯数值 1 混淆)。
float 浮点数:大写 F 或小写 f 表示。
大写 D 或小写 d 表示 double 双精度。
类型 | 描述 |
---|---|
Long 型数值 | 结尾使用大写 L 或小写 l 皆可(不推荐使用 l,因为容易与阿拉伯数值 1 混淆) |
float 浮点数 | 大写 F 或小写 f 表示 |
double 双精度 | 大写 D 或小写 d |
十六进制(以 16 为基数) | 前导 0x 或 0X 表示,后跟 0-9 或 a-f (大写或小写) |
八进制(以 8 为基数) | 由 0~7 之间的数字和前导零 0 表示 |
下划线
们可以在数字字面量中包含下划线 _,以使结果更清晰。这对于大数值的分组特别有用。
例如:0b0010_1111_1010_1111_1010_1111_1010_1111。
指数计数法
在科学与工程学领域,e 代表自然对数的基数,约等于 2.718 (Java 里用一种更精确的 double 值 Math.E 来表示自然对数)。指数表达式 “1.39 x e-43”,意味着 “1.39 × 2.718 的 -43 次方”。
// operators/Exponents.java
// "e" 表示 10 的几次幂
public class Exponents {
public static void main(String[] args) {
// 大写 E 和小写 e 的效果相同:
float expFloat = 1.39e-43f;
expFloat = 1.39E-43f;
System.out.println(expFloat);
double expDouble = 47e47d; // 'd' 是可选的
double expDouble2 = 47e47; // 自动转换为 double
System.out.println(expDouble);
}
}
三元/条件 运算符
与c语言类似
布尔表达式 ? 值 1 : 值 2
若表达式计算为 true,则返回结果 值 1 ;如果表达式的计算为 false,则返回结果 值 2。
public class TernaryIfElse {
static int ternary(int i) {
return i < 10 ? i * 100 : i * 10;
}
public static void main(String[] args) {
System.out.println(ternary(9));
System.out.println(ternary(10));
}
}
输出:
900
100
字符串运算符
这个运算符在 Java 里有一项特殊用途:连接字符串。
我们注意到运用 String +
时有一些有趣的现象。若表达式以一个 String 类型开头(编译器会自动将双引号 “” 标注的的字符序列转换为字符串),那么后续所有运算对象都必须是字符串。代码示例:
int x = 0, y = 1, z = 2;
String s = "x, y, z ";
System.out.println(s + x + y + z);
输出:
x, y, z 012