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