博客
关于我
聊聊java中final那点事
阅读量:315 次
发布时间:2019-03-03

本文共 2595 字,大约阅读时间需要 8 分钟。

文章目录

1.final是什么

final是一个java关键字,一个修饰符,可用于修饰变量,方法,修饰类.

2.final有什么用

  • final可以修饰变量时,可以使其值不能改变
  • final修饰方法时使其不能被重写
  • final修饰类时,使其不能被继承.

3.final修饰成员变量

fianl最常见的用法时用来修饰成员变量,成员变量分为静态变量与普通变量.

对于final修饰的变量,不是不能被赋值,是其值不能被改变,可以理解成只能赋一次值.可以在定义时赋值,也可以在定义后在另外赋值,但无论何种方式只能被赋值一次.

(1)修饰静态变量

修饰静态变量时,可以选择以下两种方式赋值:

  • 在定义时赋值
  • 静态初始化块内赋值
final static int a = 6;final static int b;static {   	b = 6;}

(2)修饰普通成员变量

修饰普通成员变量时,可以选择以下三种方式赋值:

  • 定义时赋值
  • 初始化块内赋值
  • 构造方法赋值
public class test{   	int c = 1;	int d;	int e;	{   		d = 2;	}	public test()	{   		e = 3;	}}

根据"静态"不能访问"非静态"规则,就是说静态的方法不能访问非静态成员,static初始化块不能初始化非静态成员,普通初始化块也不能初始化静态变量.

但是,有一个"bug"就是java允许通过方法访问final成员,因此…有趣的事情发生了.

public class test{       final int a;    {           System.out.println(a);//这里会报错        printA();        a = 3;        printA();    }    void printA()    {           System.out.println(a);    }    public static void main(String[] args) {           new test();    }}

以上这段代码会报错,因为java不允许final成员未初始化前访问.

在这里插入图片描述

把上面那一行出错的代码注释后…居然通过了编译?!

public class test{       final int a;    {           //System.out.println(a);//这里会报错        printA();        a = 3;        printA();    }    void printA()    {           System.out.println(a);    }    public static void main(String[] args) {           new test();    }}

printA()中只是用方法包装了一下输出函数,居然就通过了编译…有没有兴趣看一下结果?

在这里插入图片描述

emmmmmm…final"默认值"为0…总之就不要想这些歪门邪道去在final初始化之前访问final变量了 ,在使用final变量前初始化,初始化,初始化,重要的事情说三遍.

4.final修饰局部变量

final修饰局部变量其实也分两种,一种是修饰形参,一种是修饰方法内部的局部变量

(1)修饰形参

没什么好说的…就是形参的值不能改变.

public void f(final int a){   	a = 3;//报错.}

(2)修饰局部变量

修饰局部变量时可以定义时赋值,也可以在定义后在赋值(仅一次).

public void f(){   	final int  a = 3;	final int b;	b = 2;}

(3)final修饰引用变量

嗯…这个是一个特别一点的例子,Talk is cheap.上代码.

import java.util.Arrays;public class test{       public static void main(String[] args) {           final int[] arr = {   1,2,3};        arr[1] = 5;        Arrays.stream(arr).forEach(System.out::print);        System.out.println();        final A a = new A();        a.setA(9);        System.out.println(a.getA());    }}class A{       private int a = 3;    public void setA(int a)    {           this.a = a;    }    public int getA()    {           return a;    }}

为什么final数组可以赋值???fianl对象的值被改变了???看看结果:

在这里插入图片描述
final数组居然被改变了??final对象的值也被改变了??
其实呢,因为数组是引用类型,final修饰引用类型时,只能保证这个变量永远"指向"那一段内存空间,保存的仅仅是一个引用,但是那段内存空间的值是可以改变的.修饰对象时也是一样的道理.

5.final修饰方法

final修饰的方法不能被重写,当然,不能"配合"private"使用",因为private把方法变成了私有,相当于对子类不可见,子类都不知道父类"还有这玩意",就可以进行所谓的"重写"了.

class A{   	private final void f(){   }}class B extends A{   	public final void f(){   }//没毛病}

因为B类的f()是属于B类的,不是从A类继承过来的.

6.final修饰类

final修饰类时表示该类不能被继承.

final class A{   }class B extends A{   }//出错

这是作者的公众号,欢迎关注.

在这里插入图片描述

转载地址:http://rwyq.baihongyu.com/

你可能感兴趣的文章
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>