在最底层,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
函数来比较。
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
n1 == n2; // false
n1.equals(n2); // true
equals
默认是比较引用,所以在自己实现的类中需要覆盖equals
方法才能进行语义上的比较
&&
,||
和!
操作只能用于布尔值,与C++不同,对一个非布尔值进行逻辑运算不会对该值强制转换,会报编译错误
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 : value1
+
和+=
+
和+=
表示“拼接”操作类型转换(cast
)是指,在适当的时候,Java 会将一种数据类型自动转换为另一种。
显式的类型转换如下:
int i = 200;
long l = (long)i;
int j = (int)l;
java.lang.Math.round()
一个表达式中出现的最大的数据类型决定了该表达式最终结果的数据类型,如 int 类型与 long 类型相加,得到一个 long 类型。
由于Java中所有基本数据类型的大小都是明确的,所以不需要sizeof。BTW,boolean 不是没有明确嘛。
首发与Code & Fun
原文:https://www.cnblogs.com/wuxiaobai24/p/12301885.html