美文网首页
final修饰符

final修饰符

作者: 李霖神谷 | 来源:发表于2017-03-29 14:50 被阅读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将其当成“宏变量”处理。

    相关文章

      网友评论

          本文标题:final修饰符

          本文链接:https://www.haomeiwen.com/subject/kvbeottx.html