Java并发--final关键字
一、final使用场景
final可以稀释变量,方法和类,用于便是修饰的内容一旦赋值之后不会再被改变,比如string类就是一个final类型的类。
二、final修饰变量
在Java中变量可以分为成员变量和局部变量
成员变量
通常每个类中成员变量可以分为类变量(static修饰的变量)以及实例变量针对这两种类型的变量赋初始值的时机是不同的。
类变量可以再声明变量的时候直接赋初始值或者在静态代码块中给类变量赋初始值;而实例变量可以在声明变量的时候给实例变量赋初始值,在非静态初始化块中以及构造器中赋初始值。
类变量有两个时机赋初始值,而实例变量可以有三个时机赋初始值。当final变量未初始化时系统不会进行隐式初始化,会出现报错。

将这几种情况归纳整理一下:
类变量:必须要在静态初始化块中指定初始值或者声明该类变量时指定初始值,而且只能在这两个地方之一警醒指定;
实例变量:必须要在非静态初始化块,声明该实例变量或者在构造器中指定初始值,而且只能在这三个地方警醒指定。
局部变量
final局部变量有程序员进行显示初始化,如果final局部变量已经进行了初始化则后面就不能再次进行更改,如果final变量未进行初始化,可以进行赋值,当且仅有一次赋值,一旦赋值之后再次赋值就会出错。
基本数据类型和引用数据类型
final修饰的基本数据类型和引用类型有区别吗?
通过上面的例子我们已经看出来,如果final修饰的是一个基本数据类型的数据,一旦赋值后就不能再次更改,那么,如果final修饰的是引用数据类型?这个引用的对象能够改变吗?
package passtra;
public class FinalExample{
//在声明final实例成员变量时进行赋值
private final static Person person=new Person(25, 175);
public static void main(String[] args) {
//对final引用数据类型person进行更改
person.age=22;
System.err.println(person.toString());
}
static class Person{
private int age;
private int height;
public Person(int age, int height) {
super();
this.age = age;
this.height = height;
}
@Override
public String toString() {
return "Person [age=" + age + ", height=" + height + "]";
}
}
}
当我们对final修饰的应用数据类型变量person的属性改成22,是可以操作成功的。
通过代码可以看出,当final修饰基本数据类型时,不能对基本数据类型变量重新赋值,因此基本数据类型不能被改变,而对于引用数据类型,它仅仅保存的是一个引用,final只保证引用类型所引用的地址不会发生改变,即一直引用这个对象,但这个对象属性是可以改变的。
宏变量
利用final变量的不可更改性,在马祖下面三个条件时,该变量就会成为一个宏变量,即一个常量。
使用final修饰符修饰,在定义该final变量时就指定了初始值,该初始值在编译时就能够唯一指定。
注意:
当程序中其他地方使用该宏变量时,编译器会直接替换该变量的值。
三、final修饰方法
重写
当父类的方法被final修饰的时候,子类不能重写父类的该方法。你如在object中getClass()方法就是说final修饰的,我们就不能重写该方法,但是hasdhCode()不是被final修饰的,我们就可以重写hashCode()方法
重载
package passtra;
public class FinalExample{
public final void test(){
}
//没有报错
public final void test(int i){
}
}
可以看出被final修饰的方法可以重载
四、final修饰类
当一个类被final修饰时,表明该类不能被子类继承
子类往往可以重写父类的方法和属性,会带来一定的安全隐患,因此当一个类不希望被继承是就可以用final修饰。
五、final在JDK中有哪些应用
final经常被用作不变类上,利用final的不可更改性。
不变类
不变类的意思是创建该类的实例后,该实例的实例变量时不可改变的。满足以下条件可以成为不变类:
- 使用private和final修饰该类的成员变量;
- 提供带参数的构造器用于初始化类的成员变量;
- 仅为该类的成员变量提供getter方法,不提供setter方法,因为普通方法无法修改final修饰的成员变量;
- 如果有必要就重写object的hashCode和equals方法应该保证用equals判断相同的两个对象其HashCode值也是相等的。
JDK中提供的八个包装类和String类都是不可变的,可以看看string的实现
private final char value[];
可以看出string的value就是final修饰的,上述其他几条性质也是吻合的。
Java并发--final关键字的更多相关文章
- JAVA面向对象-----final关键字
JAVA面向对象-–final关键字 1:定义静态方法求圆的面积 2:定义静态方法求圆的周长 3:发现方法中有重复的代码,就是PI,圆周率. 1:如果需要提高计算精度,就需要修改每个方法中圆周率. 4 ...
- 聊聊Java的final关键字
Java的final关键字在日常工作中经常会用到,比如定义常量的时候.如果是C++程序员出身的话,可能会类比C++语言中的define或者const关键字,但其实它们在语义上差距还是挺大的. 在Jav ...
- java 对 final 关键字 深度理解
基础理解 : 1.修饰类 当用final去修饰一个类的时候,表示这个类不能被继承.处于安全,在JDK中,被设计为final类的有String.System等,这些类不能被继承 .注意:被修饰的类的成员 ...
- 关于java中final关键字与线程安全性
在Java5中,final关键字是非常重要而事实上却经常被忽视其作为同步的作用.本质上讲,final能够做出如下保证:当你创建一个对象时,使用final关键字能够使得另一个线程不会访问到处于" ...
- java之final关键字
final关键字(可以读不可以写.只读) 1.final的变量的值不能够被改变 ①.final的成员变量 ②.final的局部变量(形参) //意思是“实参”一旦传进我的方法里面,就不允许改变 2.f ...
- Java的final关键字详解
Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...
- java中final 关键字的作用
final 关键字的作用 java中的final关键字可以用来声明成员变量.本地变量.类.方法,并且经常和static一起使用声明常量. final关键字的含义: final在Java中是一个保留的关 ...
- Java并发——synchronized关键字
前言: 只要涉及到Java并发那么我们就会考虑线程安全,实际上能够实现线程安全的方法很多,今天先介绍一下synchronized关键字,主要从使用,原理介绍 一.synchronized的使用方法 1 ...
- Java基础 -- final关键字
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...
随机推荐
- 题解 CF917D 【Stranger Trees】
生成树计数问题用矩阵树定理来考虑. 矩阵树定理求得的为\(\sum\limits_T\prod\limits_{e\in T}v_e\),也就是所有生成树的边权积的和. 这题边是不带权的,应用矩阵树定 ...
- 微信小程序开发(一)基础知识学习
1.特点: ①无DOM对象(虚拟DOM),一切基于组件化(复用.解耦) ②四个重要文件: *.js.*.wxml --> html..wxss --> css.*.json ③无需下载 ...
- 【Go语言学习】匿名函数与闭包
前言 入坑 Go 语言已经大半年了,却没有写过一篇像样的技术文章,每次写一半就搁笔,然后就烂尾了. 几经思考,痛定思痛,决定金盆洗手,重新做人,哦不,重新开始写技术博文. 这段时间在研究Go语言闭包的 ...
- 阿里云ecs轻量级服务器node镜像部署
这个是自带安装pm2,nginx,node,mongodb的环境的,目录在控制台有给出, server端的配置按照开发手册去操作即可. 而静态的页面.需要修改nginx的配置文件,找到nginx的ng ...
- __getattribute__小例子
class student(object): def __init__(self,name=None,age=None): self.name = name self.age = age def __ ...
- PHP strnatcasecmp() 函数
实例 使用"自然"算法来比较两个字符串(不区分大小写): <?php高佣联盟 www.cgewang.comecho strnatcasecmp("2Hello w ...
- luogu P1973 [NOI2011]NOI 嘉年华 dp
LINK:NOI 嘉年华 一道质量非常高的dp题目. 考虑如何求出第一问 容易想到dp. 按照左端点排序/右端点排序状态还是很难描述. 但是我们知道在时间上肯定是一次选一段 所以就可以直接利用时间点来 ...
- Jenkins总结2-部署maven项目
1. 部署Maven项目 1.1 新建项目 选择新建任务 输入任务名称,并选择构建一个Maven项目.如果你的页面没有看到“构建一个maven项目”,则需要安装Maven Integration插件. ...
- 原来写个Vue 首页就这么简单
全栈的自我修养: 为我们的项目添加首页 You can never replace anyone. What is lost is lost. 每个人都是无可替代的,失去了便是失去了. 前言 上篇文章 ...
- 【JSOI2007】文本生成器 题解(AC自动机+动态规划)
题目链接 题目大意:给定$n$个子串,要求构造一个长度为$m$的母串使得至少有一个子串是其子串.问方案数. ------------------------ 我们可以对要求进行转化:求出不合法的方案数 ...