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将其当成“宏变量”处理。

上一篇下一篇

猜你喜欢

热点阅读