- final 数据
- 常量:基本数据类型、final修饰、定义时必须对其赋值。
- 编译期常量
- 不能因为某数据是final的就认为在编译时可以知道它的值,如:
public final int a = rand.nextInt(20);
- Java允许生成“空白final域”,所谓空白的final是指被声明为final但未给定初值的域。
- 初始化方式:必须在域的定义处或者每个构造器中用表达式对fianl进行赋值
- final参数:Java允许在参数列表中以声明的方式将参数指明为final。表明:方法中无法修改参数引用所指向的对象。
- final 方法
- 使用final方法的原因
- 把方法锁定,禁止继承类修改它的含义、并且不会被覆盖。
- 效率(忽略,早起版本适用)
- final和private关键字
- 类中所有的private方法都隐式地指定为是final的。无法取用、覆盖private方法。
- 一种特殊情况:以下f()方法并非覆盖而是创建了一个新方法。
class WithFinals {
private final void f() {
System.out.println("WithFinals.f()");
}
private void g() {
System.out.println("WithFinals.g()");
}
}
class OverridingPrivate extends WithFinals {
private final void f() {
System.out.println("OverringPrivate.f()");
}
private void g() {
System.out.println("OverrringPrivate.g()");
}
}
class OverridingPrivate2 extends OverridingPrivate {
public final void f() {
System.out.println("OverringPrivate2.f()");
}
public void g() {
System.out.println("OverringPrivate2.g()");
}
}
public class FinalOverridingIllusion {
public static void main(String[] args) {
OverridingPrivate2 op2 = new OverridingPrivate2();
op2.f();
op2.g();
OverridingPrivate op = op2;
WithFinals wf = op2;
}
}
- final 类
- final类中所有的方法都隐式的指定为final的
- 无法继承