一、final关键字概述

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

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

public final class 类名称 {
// ...
}

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

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

  3)修饰变量

  成员变量

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

package cn.sjk.study.java.final;

public class Person {

    //方法1:直接赋值
private final String name = "sjk"; }

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

package cn.sjk.study.java.final;

public class Person {

    //方法2:定义时没有赋值,通过构造方法来赋值
private final String name; public Person(String name) {
this.name = name;
}
}

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

package cn.sjk.study.java.final;

    public class Person {

        private final String name;
//下面的无参构造方法和带参构造方法里都必须对final的成员变量进行赋值,否则编译不通过
public Person() {
name = "sjk";
}
public Person(String name) {
this.name = name;
} }

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

package cn.sjk.study.java.final;

public class Person {

    private final String name;

    //对于final修饰的变量使用这种赋值方式不可行
public void setName(String name) {
this.name = name;
}
}

  局部变量-基本类型

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

package cn.sjk.study.java.final;

public class FinalDemo {
public static void main(String[] args) {
//声明变量,使用final修饰
final int age;
//第一次赋值
age = 18;
//第二次赋值
age =28; //报错,不可重复赋值 //声明变量,直接赋值,使用final赋值
final int age = 18;
//第二次赋值
age = 28; //报错,不可重复赋值 }
}

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

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

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

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

  写法2:

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

  根据 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. 基于OpenCV全景拼接(Python)SIFT/SURF

    一.实验内容: 利用sift算法,实现全景拼接算法,将给定的两幅图片拼接为一幅. 二.实验环境: 主机配置: CPU :intel core i5-7300 2.50GHZ RAM :8.0GB 运行 ...

  2. LOJ6283 数列分块入门 7 (分块 区间加/乘)题解

    题意:区间加,区间乘,单点询问 思路:假设一个点为a,那么他可以表示为m * a + sum,所以区间加就变为m * a + sum + sum2,区间乘变为m * m2 * a + sum * m2 ...

  3. 正则表达式 test 踩坑指南

    正则表达式 test 踩坑指南 test 只能使用一次,第二次返回的是错误结果! reg = /edg|edge/g; /edg|edge/g reg.test(`edg`) true reg.tes ...

  4. React Hooks: useMemo All In One

    React Hooks: useMemo All In One useMemo https://reactjs.org/docs/hooks-reference.html#usememo refs x ...

  5. JavaScript Functional Programming

    JavaScript Functional Programming JavaScript 函数式编程 anonymous function https://en.wikipedia.org/wiki/ ...

  6. CSS Modules in depth

    CSS Modules in depth https://github.com/css-modules/css-modules https://webpack.js.org/loaders/css-l ...

  7. Google IO & 2019

    Google IO & 2019 Google IO Recap \ https://www.techradar.com/news/google-io-2019-keynote https:/ ...

  8. js 如何取消promise

    1: 使用reject function hello() { let _res, _rej: any; const promise = new Promise((res, rej) => { _ ...

  9. CSS 阴影效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 生态建设者为何青睐低风险、低成本的NGK算力?

    自从BGV推向市场以来,生态建设者的目光都聚集于BGV这个去中心化金融的新星,其实NGK的其他项目也都在稳健进行当中. NGK在未来将推出"算力市场奖励计划",NGK将会对算力市场 ...