1、final数据
- 表示永不改变的编译期常量。这类常量必须是基本数据类型,在定义时就进行赋值。一个既是static又是final 的域只占据一段不能改变的存储空间。
- 在运行时初始化的值,而你不希望他被改变。
注意:如果使用final的数据不是基本类型而是其他的对象引用,那么是指引用不再改变,即一旦引用指向某个对象后不能再指向其他的对象,但是对象自身是可以被修改的;对于基本类型则是保持数值恒定不变
class A{
public int data=1;
}
public class ReuseTest {
private static final A a = new A();
public static void main(String[] args) {
ReuseTest rt = new ReuseTest();
A b = new A();
rt.a = b; //编译错误
a.data = 2; //可以正常运行
}
}
空白final:指声明为final但未给定初始值的域,空白final必须在每个构造器中用表达式进行赋值
class A{
public int data=1;
private final int b;
public A() {
b=1;
}
public A(int a) { //编译错误,在此构造器中未对b赋值
}
}
final参数:可以在方法中使用声明为final的参数,表示无法再方法中改变参数引用所指向的对象
class A{
public void f(final A a){
a = new A() //编译错误
}
}
2、final方法
- 使用final方法可以防止子类修改它的含义,子类无法重写父类的final方法。
- 早期的java使用final方法可以提高效率,现在不是很必要。
- private方法也可以声明为final但没有任何实际作用,因为private方法本身无法重写
3、final类
将类设置成final则该类无法被继承,即该类无子类。