一、final关键字概述

 final关键字具有最终或不可改变的含义,可用于修饰类、变量、方法。因此被final修饰的类、变量、方法具有以下特征:
    --final修饰的类不能被继承;
    --final修饰的方法不能被子类重写;
    --final修饰的变量(成员变量和局部变量)是常量,只能赋予一次。

 二、使用方式
  1)修饰类,格式如下:

  1. public final class 类名称 {
  2. // ...
  3. }

  2)修饰方法,格式如下:

  1. 修饰符 final 返回值类型 方法名称(参数列表) {
  2. // ...
  1. }

  3)修饰变量

  成员变量

  final修饰的成员变量初始化(赋值)有两种方式,一种是直接赋值,另一种是通过构造方法赋值,二者选其一。
  a.直接赋值代码示例:

  1. package cn.sjk.study.java.final;
  2.  
  3. public class Person {
  4.  
  5. //方法1:直接赋值
  6. private final String name = "sjk";
  7.  
  8. }

  b.通过构造方法赋值代码示例:

  1. package cn.sjk.study.java.final;
  2.  
  3. public class Person {
  4.  
  5. //方法2:定义时没有赋值,通过构造方法来赋值
  6. private final String name;
  7.  
  8. public Person(String name) {
  9. this.name = name;
  10. }
  11. }

  注意:当使用构造方法对final修饰的成员变量赋值时,必须保证类当中所有重载的构造方法,都最终会对final的成员变量进行赋值,代码示例:

  1. package cn.sjk.study.java.final;
  2.  
  3. public class Person {
  4.  
  5. private final String name;
  6. //下面的无参构造方法和带参构造方法里都必须对final的成员变量进行赋值,否则编译不通过
  7. public Person() {
  8. name = "sjk";
  9. }
  10. public Person(String name) {
  11. this.name = name;
  12. }
  13.  
  14. }

  实际开发中,初始化非final修饰的成员变量除了上面两种方式外,我们还会通过set()方法对其赋值,但是对final修饰的成员变量,只能通过上面两种方法中的任意一种,否则赋值编译会报错。如以下操作不合法:

  1. package cn.sjk.study.java.final;
  2.  
  3. public class Person {
  4.  
  5. private final String name;
  6.  
  7. //对于final修饰的变量使用这种赋值方式不可行
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. }

  局部变量-基本类型

  基本类型的局部变量,被final修饰后,只能复制一次,不能再改变。代码示例如下

  1. package cn.sjk.study.java.final;
  2.  
  3. public class FinalDemo {
  4. public static void main(String[] args) {
  5. //声明变量,使用final修饰
  6. final int age;
  7. //第一次赋值
  8. age = 18;
  9. //第二次赋值
  10. age =28; //报错,不可重复赋值
  11.  
  12. //声明变量,直接赋值,使用final赋值
  13. final int age = 18;
  14. //第二次赋值
  15. age = 28; //报错,不可重复赋值
  16.  
  17. }
  18. }

  局部变量-引用类型
  引用类型的局部变量,被fianl修饰后,只能指向一个对象,地址不能再改变。但不影响对向内部的成员变量值的修改,代码示例如下:

  1. public class FinalDemo2 {
  2. public static void main(String[] args) {
  3. //创建Person对象
  4. final Person p = new Person();
  5. //创建另一个person对象
  6. p = new Person(); //报错,指向了新对象,地址改变
  7.  
  8. //调用setName方法
  9. p.setName("sjk"); //可以修改
  10. }
  11. }

  思考,下面两种写法,哪一种可以编译通过?
  写法1:

  1. final int age = 0;
  2. for (int i = 0; i < 10; i++) {
  3. age = i;
  4. System.out.println(age);
  5. }

  写法2:

  1. for (int i = 0; i < 10; i++) {
  2. final int age = i;
  3. System.out.println(age);
  4. }

  根据 final 的定义,写法1报错!写法2,为什么通过编译呢?因为每次循环,都是一次新的变量age。这也是大家 需要注意的地方。

fianl关键词的更多相关文章

  1. 微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台

    去年 11 月的时候,微软开源了 .NET CoreFX,然后是今年 2 月份的 .NET CoreCLR.自那时以来,已经有大约 3500 人在 GitHub 上进行了提交,而且贡献者的人数还在持续 ...

  2. JavaScript中‘this’关键词的优雅解释

    本文转载自:众成翻译 译者:MinweiShen 链接:http://www.zcfy.cc/article/901 原文:https://rainsoft.io/gentle-explanation ...

  3. dede织梦批量导入关键词

    在后台替换对应的文件件即可. 注意:如果你的关键字长度超过16个字符的话,需要更改 dede 中 keywords 表中的keyword 字段字符长度 article_keywords_main.ph ...

  4. 使用python抓取百度搜索、百度新闻搜索的关键词个数

    由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用python写了一个相关的脚本. 在写这个脚本的过程中遇到了很多的问题,下面会一一道来. ps:我并没有系统地学习过pyth ...

  5. SEO优化---学会建立高转化率的网站关键词库

    想要优化好一个网站,行业的分析,以及关键词的挖掘是必要的,有一定的关键词排名了,但是转化率和流量方面却很不理想这种情况大部分是只注重了有指数的关键词排名,而忽略了长尾关键词和一些没有指数但是可以带来巨 ...

  6. 该不该在C#中使用var关键词

    作为一个并不勤快的程序猿,在项目开发过程中总是想尽办法少写代码,对var关键词的使用自然不会放过,几乎在每个能使用var的地方都用了var,对此,很多朋友同事给出了不同的建议,觉得能不使用var关键词 ...

  7. SEO:避免关键词内部竞争带来的无法收录问题,

    站内关键词相互竞争在未经过搜索引擎优化的网站中常出现.许多人不理解搜索引擎对关键词的索引原理,以为在整站内频繁布局某几个热门关键词能提升这些词的排名. 一.搜索引擎希望展现多种多样的搜索结果 搜索引擎 ...

  8. TF-IDF提取行业关键词

    1. TF-IDF简介 TF-IDF(Term Frequency/Inverse Document Frequency)是信息检索领域非常重要的搜索词重要性度量:用以衡量一个关键词\(w\)对于查询 ...

  9. MS SQLServer的关键词BETWEEN的一些注意事项

    近段时间在程序中写到有关搜索的功能.其中有使用到MS SQLServer的关键词BETWEEN,它是搜索数值范围(包括本身)之间的数据. 在使用它时,一些情况还需要注意的.如果时间的数据. 搜索时间数 ...

随机推荐

  1. C++ part6

    C++源文件从文本到可执行文件经历的过程 references: 一个C++源文件从文本到可执行文件经历的过程 C++源文件从文本到可执行文件经历的过程 gcc程序编译的静态链接和动态链接 保留中间过 ...

  2. 白日梦的ES笔记三:万字长文 Elasticsearch基础概念统一扫盲

    目录 一.导读 二.彩蛋福利:账号借用 三.ES的Index.Shard及扩容机制 四.ES支持的核心数据类型 4.1.数字类型 4.2.日期类型 4.3.boolean类型 4.4.二进制类型 4. ...

  3. μC/OS-III---I笔记9---任务等待多个内核对象和任务内建信号量与消息队列

    在一个任务等待多个内核对象在之前,信号量和消息队列的发布过程中都有等待多个内核对象判断的函数,所谓任务等待多个内核对象顾名思义就是一任务同时等待多个内核对象而被挂起,在USOC-III中一个任务等待多 ...

  4. 使用Benchmark.NET测试代码性能

    今天,我们将研究如何使用Benchmark.Net来测试代码性能.借助基准测试,我们可以创建基准来验证所做的更改是否按预期工作并且不会导致性能下降. 并非每个项目都需要进行基准测试,但是如果您正在开发 ...

  5. 【rocketmq学习笔记】rocketmq入门学习

    基本介绍 rocketmq是阿里巴巴团队使用java语言开发的一款基于发布订阅模型的分布式消息队列中间件,是一款低延迟,高可用,拥有海量消息堆积能力和灵活拓展性的消息队列. 特点 可以实现集群无单点故 ...

  6. WIN10修改应用的默认打开方式

    如图所示: 选中想要替换成为的应用程序, 在其中勾选想设默认应用的文件类型即可.

  7. 使用 HTML5 & CSS 实现一个自定义开关按钮 switch button

    使用 HTML5 & CSS 实现一个自定义开关按钮 switch button switch button <div class="switch"> < ...

  8. SMS OTP 表单最佳做法 (短信验证)

    <form action="/verify-otp" method="POST"> <input type="text" ...

  9. MySQL学习04(DQL查询)

    DQL查询 DQL语言 DQL( Data Query Language 数据查询语言 ) 查询数据库数据 , 如SELECT语句 简单的单表查询或多表的复杂查询和嵌套查询 是数据库语言中最核心,最重 ...

  10. Linux 内核和 Windows 内核有什么区别?

    Windows 和 Linux 可以说是我们比较常见的两款操作系统的. Windows 基本占领了电脑时代的市场,商业上取得了很大成就,但是它并不开源,所以要想接触源码得加入 Windows 的开发团 ...