final关键字的使用

一:final修饰的变量

  1.被final修饰的变量必须显示指定初始值。指定初始值的方法有三种。

    1.定义该变量时直接指定。

    2.在非静态代码块中指定该变量的初始值

    3.在构造器中指定该变量的初始值

  2.被final修饰的类变量同样时必须显示指定初始值。指定的方法有两种。

    1.定义该变量时直接指定。

    2.在静态代码块中指定该变量的初始值

注意:本质上final修饰的实例变量初始化是在构造器中进行的,以上三种方法的本质是一样的。而final修饰的类变量初始化本质上是在静态代码块中进行的。

 1        class Price {
 2         final static Price instance = new Price(2.8);
 3         final static double initPrice = 20;
 4         double currentPrice;
 5         public Price(double discount){
 6             currentPrice = initPrice - discount;
 7         }
 8     }
 9     public class PriceTest{
10         public static void main(String[] args) {
11             System.out.print(Price.instance.currentPrice);
12             Price p = new Price(2.8);
13             System.out.print(p.currentPrice);
14         }
15     }
16 此时输出的是17.2,17.2
View Code
    class Price {
        final static Price instance = new Price(2.8);
        static double initPrice = 20;
        double currentPrice;
        public Price(double discount){
            currentPrice = initPrice - discount;
        }
    }
    public class PriceTest{
        public static void main(String[] args) {
            System.out.print(Price.instance.currentPrice);
            Price p = new Price(2.8);
            System.out.print(p.currentPrice);
        }
    }

此时输出的是-2.8,17.2
View Code

如果定义Final类型的变量(不管是类变量,实例变量,还是局部变量)时指定了初始值,而且该初始值可以在编译的时候就被确定下来(基本数据类型的变量),则系统不会在初始化块中对该类变量赋初始值,而是在类定义中直接使用该值。此时这个变量本质上是一个“宏变量”。除了直接赋值的情况外,如果被赋的表达式只是基本的算术运算表达式或字符串连接运算,没有访问普通变量,调用方法,java编译器同样会将这种final变量当成“宏变量处理”。

原文地址:https://www.cnblogs.com/zhlblogs/p/9084473.html