参数传递
class A {
int value;
}
public class PassTest {
public static void main(String[] args) {
A a = new A();
System.out.println(a.value); // 0
fun1(a);
System.out.println(a.value); // 0
fun2(a);
System.out.println(a.value); // 1
}
static void fun1(A a) {
a = new A();
a.value = 1;
}
static void fun2(A a) {
a.value = 1;
}
}
函数里改变引用,对参数本身是没有影响的
如果改变引用上的内容,对参数本身是由影响的
float 与 double
Java不能隐形向下转型,因为这会使得精度降低。
// float f = 1.0; cannot convert from double to float
float f = 1.0f; // 正确的方式
1.0字面量属于double类型;1.0f字面量才是float类型
隐式类型转换
public static void main(String[] args) {
short s = 1;
// s = s + 1; // cannot convert from int to short
s += 1;
s++;
}
编译后
Code:
stack=2, locals=2, args_size=1
0: iconst_1
1: istore_1
2: iload_1
3: iconst_1
4: iadd
5: i2s
6: istore_1
7: iload_1
8: iconst_1
9: iadd
10: i2s
11: istore_1
12: return
short类型的加法都是利用int类型的指令来操作的,最后利用i2s转为short类型
byte和char
也是同样的效果
所以 s + 1的结果是int类型,无法隐形转为short类型
但是 += 和 ++ 编译器会自动转换,属于Java的语法糖,如下:
short s = 1;
s += 1;
等价于
s = (short)(s + 1);
s++;
等价于
s = (short)(s + 1);
switch
- switch 可作用于char byte short int
- switch 可作用于char byte short int对应的包装类
- switch 不可作用于long double float boolean,包括他们的包装类
- switch 中可以是字符串类型(JDK1.7后)
- switch 中可以是枚举类型(JDK1.5后)
关于String的switch实现,使用hashcode转化为int类型来实现,再加上equal方法做保障,也属于Java的语法糖。
参考