final修饰类、变量、方法
final 修饰类、方法、变量,表示不可变的
final 修饰变量:不可变,必须赋初值。
- final成员变量:必须由程序员显示的指定初始值。
成员变量随着类或对象的初始化而初始化。当执行静态初始化块时可以对类变量赋初始值;当执行普通初始化块、构造器时可对实例变量赋初始值。
final修饰的实例变量,要么在定义该实例变量时执行初始值,要么在普通初始化块或构造器中为该实例变量指定初始值。
final修饰的类变量,要么在定义该类变量时指定初始值,要么在静态初始块中为该类变量指定初始值。
尽量不要在final变量显示初始化之前访问它。 - final局部变量:系统不会对局部变量进行初始化,必须由程序员显示初始化。不能对形参赋初值。
- final 修饰基本类型变量和引用类型变量的区别
修饰基本类型变量:只能赋值一次
修饰引用类型变量:只要它所引用的地址不变,即一直是这个对象,但对象的属性可以变化。以下代码合法。
final Person p = new Person();
p.setAge(23); - 可执行“宏替换”的final变量
满足的条件:
(1)使用final修饰符修饰
(2)定义该final变量事制定了初始值
(3)该初始值可以在编译时被确定下来
编译器会把程序中所有用到该变量的地方直接替换成该变量的值。
eg: final in a = 5;
System.out.println(a);
运行时,变量a根本不存在,直接执行System.out.println(5)
常量池来管理用过的字符串直接量:String a = “Java”;
String b = “Java”.此时,a和b都指向常量池中的"Java"字符串。 - final方法: 不能被重写(子类不能重写父类的方法)。
Java提供的Object类里有一个final方法:getClass()方法。
方法重载是指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
方法重写是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型。
final修饰的方法不能被重写,但是能被重载。
final类 :final修饰的类不能有子类。
不可变类 :指创建该类的实例后,该实例的实例变量是不可改变的。
创建自定义的不可变类,遵守以下规则:
(1)使用private 和final修饰符来修饰该类的成员变量
(2)提供带参数构造器,用于根据传入参数来初始化类里的成员变量。
(3)提供getter()方法,不提供setter方法。
(4)如果有必要,重写Object类的hashCode()方法和equals()方法。保证equals()相等时,hashCode()也相等。
- 如果需要这几一个不可变类,需要注意引用类型的成员变量,如果引用类型的成员变量的类是可变的,就需要采取措施保护成员变量所引用的对象不会被修改。
缓存实例的不可变类
不可变类的实例状态不可变,可以方便被多个对象所共享。如果程序中经常使用相同的不可变类实例,则考虑缓存这种不可变类的实例。如果缓存池已满,则采用“先进先出”的规则决定哪个对象被移除缓存池。
Integer in1 = new Integer.valueOf(6);生成Integer对象,并缓存该对象,只缓存-128 ~~127之间的Integer对象。