三、参数传递、类型转换、Switch、Final、Static
1. 参数传递
Java 的参数是以值传递的形式传入方法中,而不是引用传递。基本类型值就是值,引用类型变量的值是引用地址。
public static void main(String[] args) {
Apple apple = new Apple("莫逸风");
String str = "莫逸风";
updateName(apple);
updateName(str);
System.out.println(apple.getName()); // 莫逸雪
System.out.println(str); // 莫逸风
}
public static void updateName(Apple apple){
apple.setName("莫逸雪");
}
public static void updateName(String str){
str = "莫逸雪";
}
2. 类型转换
Java 不能隐式执行向下转型,因为这会使得精度降低。
short s1 = 1;
s1 = s1 + 1;
第二行赋值是错误的,因为字面量1是int不能隐式类型转换为shot。
但是使用+=、-=、*=、、= 或者 ++、-- 运算符会执行隐式类型转换。
s1 += 1;
s1++;
上面的语句隐式的进行了强制类型转换,相当于
s1 = (short) (s1 + 1);
3. Switch
从 Java 7 开始,可以在 switch 条件判断语句中使用 String 对象。
switch 不支持 long、float、double,是因为 switch 的设计初衷是对那些只有少数几个值的类型进行等值判断,如果值过于复杂,那么还是用 if 比较合适。
4. Final
数据:声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。对于基本类型,final 使数值不变;对于引用类型,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
方法:声明方法不能被子类重写。private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是重写基类方法,而是在子类中定义了一个新的方法。
类:声明类不允许被继承
5. Static
静态变量:又称类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以通过类名来访问它。静态变量在内存中只存在一份。
实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
静态方法:静态方法在类加载的时候就存在了,方法中不能有this和super关键字,因为这两个关键字与具体对象关联。
静态语句块:静态语句块在类初始化时运行一次。
静态内部类:非静态内部类依赖于外部类的示例,也就是说需要先创建外部类示例,才能用这个实例去创建非静态内部类,而静态内部类不需要。静态内部类不能访问外部类的非静态的变量和方法。
静态导包:在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
存在继承的情况下,初始化顺序为:
- 父类(静态变量、静态语句块)
- 子类(静态变量、静态语句块)
- 父类(实例变量、普通语句块)
- 父类(构造函数)
- 子类(实例变量、普通语句块)
- 子类(构造函数)