final 类似 c 的 const 。
final修饰变量,并不意味着变量的值要在编译期间确定。见下面代码。
1.用于字段
无论作用于基本类型还是引用类型,效果都是,不允许对字段再次赋值。
java没有提供约束对象不变的机制。final修饰变量,并不意味着变量的值要在编译期间确定。见下面代码。
class A{ private static Random rand=new Random(); private final int i1=rand.nextInt();//运行期间确定的final成员 } class B{ private final int i1; //定义处可以不为final成员赋值 public B(int x){ i1=x; //运行期间确定的final成员 } }
2.用于方法
具体又分两种情况。
2.1 方法主体
同时具有两个作用——禁止子类重写与编译器的内联优化。
2.2 函数形参
若形参用 final修饰,与final作用于变量效果一致。感觉没什么实际意义。
public final void f(){} void fun2(final A reA){ //reA=new A(); //illeagl,reA is final }
3.用于类
不允许其他类继承,即该类不能拥有子类。
除了用final,将构造函数设为私有也可以达到同样的效果。