详解Java中final的用法
概念
final具有“不可改变的”的含义,可以修饰非抽象类、非抽象成员方法和变量。
- 用final修饰的类不能被继承,没有子类。
- 用final修饰的方法不能被子类的方法覆盖(重写)。
- 用final修饰的变量表示常量,只能被赋一次值(声明变量的时候)。
注:
final不能用来修饰构造方法,因为“方法覆盖”这一概念仅适用于类的成员方法,而不适用于类的构造方法,父类的构造方法和子类的构造方法之间不存在覆盖的关系,因此用final修饰构造方法没有任何意义。
父类中用private修饰的方法不能被子类的方法所覆盖,因此可以理解为private类型的方法默认是final类型的。
final类
把类定义为final,使这个类不能被继承。具体使用场景如下:
- 不是专门为继承而设计的类,类本身的方法之间有复杂的调用关系。如果随意创建这些类的子类,子类有可能会错误的修改了父类的实现细节。
- 处于安全的原因,类的实现细节不允许在被扩展。
- 在创建对象模型时,确信这个类不会再被扩展。
例如:JDK中的java.lang.String类被定义为final类型。
publicfinalclassString{...}
final方法
在某些情况下,出于安全原因,父类不允许子类覆盖某个方法,此时可以把这个方法声明为final类型。
例如:JDK中的java.lang.Object类中,getClass()方法为final类型,而equals()方法不为final类型。
所有Object的子类都可以覆盖equals()方法,但不能覆盖getClass()方法。
final变量
用final修饰的变量表示取值不会改变的常量。
例如:JDK中java.lang.Integer类中定义了两个常量。
publicstaticfinalint MIN_VALUE=0x80000000;
publicstaticfinalint MAX_VALUE=0x7fffffff;
final变量具有以下特征:
- final修饰符可以修饰静态变量、成员变量和局部变量,分别表示静态常量、实例常量和局部常量。
publicclassDemo{ publicstaticfinalintMAX_VALUE=23;//静态常量 publicstaticfinalintMIN_VALUE=10;//静态常量 privatefinalDatebirthday=newDate();//成员常量 }
静态常量一般以大写字母命名,单词之间以“_”符号分开。
- final修饰的成员变量必须初始化。
publicclassFinalTest{ finalinta=1;//成员常量默认初始化 staticfinalintb=2;//静态常量默认初始化 finalintc;//成员常量 staticfinalintd;//静态常量 publicFinalTest(){ c=3;//成员常量未默认初始化,可在构造函数中初始化 } static{ d=4;//静态常量未默认初始化,可在静态代码块中初始化 } }
final变量只能赋一次值,如果将引用类型的变量用final修饰,该变量只能始终引用一个对象,但可以改变对象的内容。
publicclassFinalTest{ Stringstr=""; publicvoidprint(){ System.out.println(str); } publicstaticvoidmain(String[]args){ finalFinalTestfinalTest=newFinalTest(); finalTest.str="xixihaha"; finalTest.print(); } }
总结:
实际程序中,通过final修饰符来定义常量,目的为:
- 提高程序的安全性。
- 提高代码可维护性。
- 提供代码可读性。
以上就是本文的全部内容,希望对大家的学习有所帮助。