Java|Java语言中的修饰符(2)—final
一、引入
之前我们已经在《Java|Java语言中的修饰符(1)—static》中介绍了Java中的修饰符以及详细阐述了static的用法,领略了static的“神奇”用法,相信大家已经迫不及待地想要接触修饰符家族中的下一个成员,final,作为整个家族“死板”的代表,它象征着安全,接下来,让我们一起来仔细学习这一修饰符。
二、用法
final的含义是“不可改变的”,可以修饰非抽象类,非抽象成员方法以及变量,其中具体可分为:
- 用final修饰的类不能被继承,没有子类
- 用final修饰的方法不能被子类的方法覆盖
- 用final修饰的变量表示常量,只能赋值一次
final不能用来修饰构造方法,因为对于构造方法而言,父类与子类不存在“方法覆盖”,所以final修饰构造方法是无意义的。而用private修饰的方法默认为final类型的,所以private修饰的方法不能被子类的方法覆盖。
2.1 final类
继承关系的最大弱点在于打破封装,子类可以访问父类的实现细节,并且可以以覆盖的方式进行修改实现细节,但有很多情况下,我们不希望一个类被继承,例如:
- 不是专门为继承而设计的类,类本身的方法之间有复杂的调用关系
- 出于安全考虑,不得改动
- 创建类的时候不会再有扩展
其具体代码示例可以参考如下:
public final class Student{...}
//当subStudent类要继承Student类时
public class subStudent extends Student{...}//编译出错,不允许创建子类
2.2 final方法
在某些情况下,就安全性考虑,父类中的某一方法不允许被子类覆盖,此实我们可以将这一方法声明为final类型,具体实例代码如下,我们定义Object类中的getClass()方法为final类型,所有Object的子类都不可以覆盖getClass()方法,会导致编译错误,例如Cat类试图进行覆盖。
public class Object{
//返回包含类的类型信息的Class实例
public final Class getClass(){...}
}
public class Cat{
public Class getClass(){...}//编译出错,不允许覆盖Object类的getClass()方法
}
2.3 final变量
final常用来修饰取值不会改变的常量,可以用来修饰静态变量、实例变量和局部变量,分别表示各类常量,其具有以特点:
(1) final类型的成员变量必须显式初始化(可在构造方法、定义时,静态代码块),否则编译出错,代码示例如下:
public class Sample{
final int var1=0;//正确
final int var2;//编译出错,其必须显式初始化
}
(2) final变量只能进行一次赋值,以下代码试图为var1赋值两次,导致编译出错。
public class Sample{
final int var1=0;
public Sample(){
var1=2;//编译出错,不允许改变var1实例常量的值
}
}
(3)引用类型的变量用final修饰,那么该变量只能始终引用一个对象,但可以改变对象的内容,具体代码如下:
public class Sample{
public int var;
public Sample(int var){
this.var=var;
}
public static void main(String[] args){
final Sample s=new Sample(2);s
s.var=1;//合法
s=new Sample(3);//编译出错,不能改变引用变量s所引用的Sample对象
}
}
三、总结
final修饰符的使用可以提升程序的安全性,可维护性以及可读性,其使得整个Java程序更加稳定有效,更多Java语言中的知识还等我们探索中,大家敬请期待,由于小编水平有限,讲不到的地方,还请读者们自行补充,若文中理论或者代码有错误,希望大家及时联系小编进行修正,谢谢大家!