final修饰符
2017-03-29 本文已影响9人
李霖神谷
final修饰符是java中比较简单的修饰符,但也是一个被误解最多的修饰符。
final可以修饰变量,被final修饰的变量被赋初始化值之后,不能对它重新赋值。
final可以修饰方法,被final修饰的方法不能被重写。
final可以修饰类,被final修饰的类,不能派生子类。
对于普通的实例变量,java程序可以对他执行默认初始值,但是对于final实例变量则必须由程序员显示指定初始值。
定义final实例变量时指定初始
在非静态初始化块中为final实例变量指定初始化值。
在构造器中为final实例变量指定初始化值。
public class Demo {
final int var1 = "lishuai".length();
final int var2;
final int var3;
{
var2 = "liqian".length();
}
public Demo() {
this.var3 = "limin".length();
}
public static void main(String[] args) {
Demo d=new Demo();
System.out.println(d.var1);
System.out.println(d.var2);
System.out.println(d.var3);
}
}
需要指出var1,var2,var3虽然在不同地方指定初始化值,但是经过变一起的处理,这三种方式都会被抽取到构造器中附初始值。
对于final类变量而言,必须显示的指定初始值,而且只能在两个地方指定初始值。
定义final类变量时指定初始值。
在静态初始化块中指定初始值。
public class Demo{
final static int var1="mahuongmei".length();
final static int var2;
static{
var2="madongmei".length();
}
public static void main(String[] args) {
System.out.println(Demo.var1);
System.out.println(Demo.var2);
}
}
需要指出的是,经过编译器的处理,这两种初始化方式都会抽取到静态初始化块中被赋予初始值。
class Price{
final static Price INSTANCE=new Price(2.8);
static double iniprice=20;
double currentprice;
public Price(double discount){
currentprice=iniprice-discount;
}
}
public class Demo{
public static void main(String[] args) {
System.out.println(Price.INSTANCE.currentprice);
Price p=new Price(2.8);
System.out.println(p.currentprice);
}
}
class Price{
final static Price INSTANCE=new Price(2.8);
final static double iniprice=20;
double currentprice;
public Price(double discount){
currentprice=iniprice-discount;
}
}
public class Demo{
public static void main(String[] args) {
System.out.println(Price.INSTANCE.currentprice);
Price p=new Price(2.8);
System.out.println(p.currentprice);
}
}
对比上面两个输出结果,不难发现,当使用final修饰类变量时,如果定义该java类变量时指定了初始值,而且该初始值可以在编译时期就被确定下来(int double Strng类型)系统将不会在静态初始化块中对类变量初始化,而是在类定义中直接使用该初始值。java将其当成“宏变量”处理。