JavaJava语言中的修饰符(2)—final

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语言中的知识还等我们探索中,大家敬请期待,由于小编水平有限,讲不到的地方,还请读者们自行补充,若文中理论或者代码有错误,希望大家及时联系小编进行修正,谢谢大家!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值