Java 基础
3. 运算
3.1 参数传递
Java 的参数是以值传递的形式传入方法中,而不是引用传递。
在将一个参数传入一个方法时,本质上是将对象的地址以值的方式传递到形参中。因此在方法中使指针引用其它对象,那么这两个指针此时指向的是完全不同的对象,在一方改变其所指向对象的内容时对另一方没有影响。
public class Person {
String name;
Dog(String name) {
this.name = name;
}
String getName() {
return this.name;
}
void setName(String name) {
this.name = name;
}
String getObjectAddress() {
return super.toString();
}
}
public class PassByValueDemo {
public static void main(String[] args) {
Person person = new Person("A");
System.out.println(person.getObjectAddress()); // Person@4554617c
func(person);
System.out.println(person.getObjectAddress()); // Person@4554617c
System.out.println(person.getName()); // A
}
private static void func(Person person) {
System.out.println(person.getObjectAddress()); // Person@4554617c
person = new Person("B");
System.out.println(person.getObjectAddress()); // Person@74a14482
System.out.println(person.getName()); // B
}
}
如果在方法中改变对象的字段值会改变原对象该字段值,因为改变的是同一个地址指向的内容。
class PassByValueDemo {
public static void main(String[] args) {
Person person = new Person("A");
func(person);
System.out.println(person.getName()); // B
}
private static void func(Person person) {
person.setName("B");
}
}
}
3.2 float 与 double
Java 不能隐式执行向下转型,因为这会使得精度降低。
1.1 字面量属于 double 类型,不能直接将 1.1 直接赋值给 float 变量,因为这是向下转型。
float f = 1.1; // 错误: 不兼容的类型: 从int转换到short可能会有损失
1.1F 字面量才是 float 类型。
float f = 1.1F;
3.3 隐式类型转换
因为字面量 1 是 int 类型,它比 short 类型精度要高,因此不能隐式地将 int 类型下转型为 short 类型。
short s1 = 1;
s1 = s1 + 1; // 错误: 不兼容的类型: 从int转换到short可能会有损失
但是使用 += 或者 ++ 运算符可以执行隐式类型转换。
short s1 = 1;
s1 += 1;
s1++;
上面的语句相当于将 s1 + 1 的计算结果进行了向下转型:
s1 = (short) (s1 + 1);
3.4 switch
从 Java 7 开始,可以在 switch 条件判断语句中使用 String 对象。
String s = "a";
switch (s) {
case "a":
System.out.println("a");
break;
case "b":
System.out.println("b");
break;
}
}
switch 不支持 long,是因为 switch 的设计初衷是对那些只有少数的几个值进行等值判断,如果值过于复杂,那么还是用 if 比较合适。
long x = 1L;
switch (x) { // Incompatible types. Found: 'long', required: 'char, byte, short, int, Character, Byte, Short, Integer, String, or an enum'
case 1L:
System.out.println(1L);
break;
case 2L:
System.out.println(2L);
break;
}