final关键字在java中是一个很重要的关键字,其实按照其字面意思理解,就可以一窥这个关键字端倪,final的本意是最终的。所谓最终的,其最重要的特征就是不能修改,由此衍生出的许多细节均应以这个特征作为基础。

  final可以修饰类、方法、变量。变量包括成员变量和局部变量。

  1.修饰类

  final修饰过的类不能被继承,如下的代码在ide中是会报错的。

  

final class Father{}
//The type son cannot subclass the final class Father
class son extends Father{}

  2.修饰方法

  final关键字修饰过的方法不能被子类重写。

  

class Father {public final void father_func() {System.out.println("father function");}}
class son extends Father {//Cannot override the final method from Fatherpublic void father_func() {}
}

  其实不管是final修饰的类不能被继承,还是final修饰的方法不能被子类重写,都是要保证这个类,这个方法时最终的,不能再被更改。这也符合final的本意。

  3.修饰成员变量

  final修饰的成员变量只能被赋值一次,而且必须在声明的同时或者构造函数中显式赋值,然后才能使用。否则ide会给出提醒。因为不像普通的成员变量,即便不显式初始化,系统也会默认初始化。

  以下代码会出错。

public class FinalDemo {final Father f;//The blank final field f may not have been initializedpublic FinalDemo(){}public static void main(String args[]) {}}class Father {public final void father_func() {System.out.println("father function");}}

  这样写才正确 

public class FinalDemo {final Father f;public FinalDemo(){f=new Father();}public static void main(String args[]) {}}

  4.修饰局部变量

  final修饰的局部变量只能被赋值一次。有时候我们方法的形式参数(这也相当于一个局部变量)用final 来声明,目的就是告诉编程的人,不要再在方法体里面给这个变量去赋值了。

  如下代码是错误的。

class Father {public void func(final int y){//The final local variable y cannot be assigned. It must be blank and not using a compound assignmenty=3;System.out.println(y);}}

  既然y被final修饰,它就不能在方法体中继续赋值。修改成如下,并调用才是正确的。

  

public class FinalDemo {public static void main(String args[]) {Father f=new Father();f.func(1);f.func(3);}}class Father {public void func(final int y){System.out.println(y);}}

  上述执行的结果是1和3。两次调用func,分别传入1和3给final形参y。此处不要认为我修改了y的值,我调用了两次func方法,两次的局部变量并不是同一个。所以不存在重复赋值的说法。

  如果在方法体中定义一个final类型的局部变量,则只能给他赋值一次,不能重复赋值,这很好理解。当然也不能不赋值,这是最基本的,方法体中不管是不是final修饰的局部变量,都应该先被赋值才能使用。

  5.如果一个类中的成员变量,除了用final修饰,还加上了static,那么他就有两层的属性,首先是静态的,可以直接通过类名直接访问得到。其次它是不可再被修改的。那么这种类型的变量我们可以称之为静态常量,它必须在声明的时候就直接显式初始化,即便在构造函数中都不能再初始化(可以理解为静态变量并不需要实例化就可以访问到,所以有可能不会执行到构造函数里面的代码,这就无法保证这个final变量一定会被初始化,于是干脆在声明的时候就初始化,最为保险)。

  这种静态常量可以直接通过类名来访问,当我们再加上一个访问权限修饰符,比如public以后,这就成为了一个全局的常量,在整个项目中都能被访问到。在项目中,我们经常在一个类中写满了public static final类型的变量,并且命名为constant.java。然后通过constant.x来获取这些常量。

  

  

转载于:https://www.cnblogs.com/roy-blog/p/7670327.html

final关键字细节相关推荐

  1. final关键字的这8个小细节,你get到几个?

    前言 大家好,我是狂聊君. 今天来聊 final 关键字,因为最近在看的几本书都讲到了 final 关键字,发现好多小细节自己都忽视了,抽空总结了一下,分享给大家. 正文 final关键字是一个常用的 ...

  2. final 关键字的 8 个小细节

    作者 | 狂聊君   责编 | 张文 头图 | CSDN 下载自视觉中国 今天来聊 final 关键字,因为最近在看的几本书都讲到了 final 关键字,发现好多小细节自己都忽视了,抽空总结了一下,分 ...

  3. Java学习总结:11(final关键字)

    final关键字 在Java中final称为终结器,在Java中可以使用final定义类.方法和属性. 一.使用final定义的类不能再有子类,即:任何类都不能继承以final声明的父类. 在设计类的 ...

  4. final关键字用法

    Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的 ...

  5. Java基础super关键字、final关键字、static关键字、匿名对象整理

    super关键字 10.1子父类中构造方法的调用 public class Test { public static void main(String[] args) { new Zi(); } } ...

  6. 《final关键字》

    基本介绍: final可以修饰类.属性.方法和局部变量. 在某些情况下,程序员可能有以下需求,就会使用的final 1)当不希望类被继承时,就可以用final修饰 2)当不希望父类的某个方法被子类覆盖 ...

  7. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  8. 单例设计模式与final关键字

    目录 final关键字 什么是设计模式: 1.静态方法和属性的经典使用 2.设计模式是在大量的实践中总结和理论化之后优选的代码结构.编程风格.以及解决问题的思考方式.设计模式就像是经典的棋谱,不同的棋 ...

  9. JAVASE零基础入门——package、封装、继承、访问权限修饰符、super、重写、Javabean 和 final 关键字

    目录 一.Package 二.封装 三.继承 四.访问权限修饰符 五.super 关键字 六.重写 6.1 重写 与 重载 之间的区别 : 6.2 重写的实现条件: 6.3 重写的需求 : 6.4 调 ...

最新文章

  1. Android APK反编译
  2. ISME:中科院微生物所揭示细菌利用光能新机制!
  3. Spring(AbstractRoutingDataSource)实现动态数据源切换
  4. Zookeeper详解(一):分布式与Zookeeper
  5. 吉林大学计算机科学与技术学院推免,2017吉林大学计算机科学与技术大学生推免夏令营...
  6. 用户表如何区分普通用户和管理员_普通用户如何辨别铝合金型材的好坏?
  7. 13、Power Query-逆透视列的解析(上)
  8. ActiveReports 报表应用教程 (4)---分栏报表
  9. 万用表怎么测量电池容量_万用表检测光电耦合器的常用技巧
  10. 漫步数学分析二——欧几里得空间
  11. 上三角、下三角、对称矩阵
  12. 制作一个html网页的步骤,制作一个完整的网页的步骤
  13. 微信公众号接入微软小冰
  14. 曾扬言 机器人合法公民_曾扬言“摧毁人类”的机器人索菲亚,现状如何?如果失控了咋办?...
  15. 衡量电子计算机性能指标是,衡量计算机的性能指标有
  16. python 基础知识点 (一)
  17. Python.openpyxl操作Excel
  18. css constant() env()设置iphoneX等机型刘海屏、底部小黑条自动留白 设置安全区域与边界的距离
  19. 加速Yahoo收录你博客的窍门
  20. 论文阅读 [CVPR-2022] BatchFormer: Learning to Explore Sample Relationships for Robust Representation Lea

热门文章

  1. Linux学习之创建子进程
  2. iftop是一个很好用的实时流量监测程序,跟使用iftop查看linux连接进程占用的实时流量...
  3. App-V 4.6 SP1系列之五包加速器的制作
  4. how to covid free at cambridge?
  5. WHEN OVERSEAS
  6. 如果有两个很大的数加在一起
  7. docsify-edit-on-github
  8. 软件开发的“黑名单”规则设定:benchmark
  9. ae的渲染引擎:cineware
  10. 1970.1.1这个特殊时间