java 对 final 关键字 深度理解
基础理解 :
1.修饰类
当用final去修饰一个类的时候,表示这个类不能被继承。处于安全,在JDK中,被设计为final类的有String、System等,这些类不能被继承 。注意:被修饰的类的成员可以是final修饰,也可以不是 。
2.修饰方法 :
方法不能被子类重写。常用在类设计时不希望被子类重写而修饰。
3.修饰方法参数 :
被修饰 的参数变量,不能在方法体内再次被赋值。这个好像是站在调用者的角度考虑的哈,就好像有个大佬拿了把菜刀给我,叫我去看人 ,大佬说,你一定要用这把菜刀去砍,不要给换了屠龙刀,也不要换了把机关枪,不然你就死定了 。总没感觉这个这个final修饰参数的价值在哪 ,不知道理解到位没有。
4.修饰成员变量。
被修饰的成员变量,只能被赋值一次 。一定会在类初始化之前被赋值。
深理解,及使用
主要运用修饰成员变量的一些特性(个人觉得这方面用的比较多 )在java中的使用.
1.利用final修饰的成员变量,必须在类初始化赋值,设计类的继承使用 。
场景 : 在设计类A的时候有个字段field 是必须的。但是这个类可能会有很多的子类,而每个子类的值是不一样的 。那么就可以设计这个fileld 用final 修饰。在子类初始化时候赋值。如一下代码,我假设人的名字名字都是必须的,设计Person类,但是每个人的名字又不同,于是用final修饰字段name,让name在构造方法中赋值 。那么继承Person的子类必须调用 Person 构造方法给name赋值 。这么做有个缺陷就是会失去无参构造方法的使用。
public class Person {
final String name ; // 不赋值,就必须在构造方法中赋值。
public Person(String name){
this.name = name;
}
public void worlk() {
}
}
public class Student extends Person {
public Student(String name) {
super(name); //必须调用父类的构造器
}
@Override
public String toString() {
return "Student [name=" + name + "]";
}
public static void main(String[] args) {
Student s = new Student("A");
Student s1 = new Student("B");
System.err.println(s); // 输出: Student [name=A]
System.err.println(s1);// 输出: Student [name=B]
}
}
2.final 关键字对并发编程的特殊意义,代码出自《java多线程编程指南》
public class FinalFieldExample {
final int x;
int y;
static FinalFieldExample instance;
public FinalFieldExample() {
x = 1;
y = 2;
}
public static void writer() {
instance = new FinalFieldExample();
}
public static void reader() {
final FinalFieldExample theInstance = instance;
if (theInstance != null) {
int diff = theInstance.y - theInstance.x;
// diff的值可能为1(=2-1),也可能为-1(=0-1)。
print(diff);
}
}
private static void print(int x) {
// ...
}
}
以上并发编程中就会有安全隐患,当然在事件中也不会有这种代码设计 。书中只是用来做列子参考。在编译器初始化对象的时候,其实不是原子操作,(针对有成员对象)。以上代码在初始化 FinalFieldExample 的时候,等效一下的伪代码:
objRef = allocate (FinalFieldExample.class) ;//子操作1:分配对象所需的存储空间
objRef.x=1;//子操作2:对象初始化
objRef.y=2://子操作3:对象初始化
instance =objRef;//子操作4:将对象赋值给引用变量
但是有时候编译器,会优化代码,重编译 。对变量y的赋值在对象初始化完成之后,也就是,有可能第三步,会在第四步之后之前。这样可能在第四步执行完成之这一刻,别的线程调用了这个对象,那么这个y的值是默认初始值0,而不是期待值2。但是变量X的值是可以保证的,因为被final修饰 ,必须在FinalFieldExample 初始化之前被赋值 ,可以保证步骤2不会被优化排序到步骤4之后,而保证对其他线程的可见。
所有以上代码,y也有final修饰之后,可以保证调用线程拿到期望值 y = 2; x = 1;
3. 设计安全对象:不可变对象。
待更新...
java 对 final 关键字 深度理解的更多相关文章
- JAVA面向对象-----final关键字
JAVA面向对象-–final关键字 1:定义静态方法求圆的面积 2:定义静态方法求圆的周长 3:发现方法中有重复的代码,就是PI,圆周率. 1:如果需要提高计算精度,就需要修改每个方法中圆周率. 4 ...
- 聊聊Java的final关键字
Java的final关键字在日常工作中经常会用到,比如定义常量的时候.如果是C++程序员出身的话,可能会类比C++语言中的define或者const关键字,但其实它们在语义上差距还是挺大的. 在Jav ...
- java中对final关键字的理解以及使用场景
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.
- Java基础 -- final关键字
在java的关键字中,static和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中final关键字修饰变量、方法、类的含义是什么
Java中的关键字final修饰变量.方法.类分别表示什么含义? 先看一个简单的介绍 修饰对象 解释说明 备注 类 无子类,不可以被继承,更不可能被重写. final类中的方法默认是final的 方法 ...
- java浅析final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...
随机推荐
- flask 中的endpoint有什么用?
url到view function之间的一个中间概念,默认是view function的名字,相比于直接使用view function, 使用end point 提供了一个命名空间,可以让不同蓝图的v ...
- python -m参数
把模块当做脚本运行,标准库和第三方库都可以 会把当前路径添加到sys.path中
- MySQL基础语句(查询)
students表 id class_id name gender score 1 1 小明 M 90 2 1 小红 F 95 3 1 小军 M 88 4 1 小米 F 73 5 2 小白 F 81 ...
- 软件分享:网页监测及 IIS 重启工具 IISMonitor
本人以前编写过一款简单的工具软件 IISMonitor,这几天整理完善并补写了使用说明,分享出来,供大家免费使用.使用过程中,遇到什么问题或有什么建议,也可回帖留言,我尽力提供修改支持. 1.工具简介 ...
- Prometheus的监控解决方案(含监控kubernetes)
prometheus的简介和安装 Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的.自2012年成立以来,许多公司和组织都采用了普罗米修斯,该项目拥有 ...
- js--history 对象详解
前言 我们浏览一个网页时可能不太会注意网页前进后退这些操作,但是在开发时你是否想过页面之间的跳转经历了什么,浏览器时怎么保存的页面信息,重新返回上一个页面的时候是否需要重新加载页面呢,会有很对疑问,要 ...
- 【Tool】IDEA功能--SVN和Git
IDEA功能--SVN和Git 2019-11-08 21:12:22 by冲冲 1.IDEA的SVN (1)提交项目代码到SVN服务器 ① 指定不用上传的目录 ② 设置项目上传的路径 SVN服务 ...
- Date相关类
Date相关类 SimpleDateFormat类中format()和parse()方法 parse 字符串 --> 日期 format 日期 --> 字符串 Date类中getTime( ...
- Atcoder Grand Contest 001 F - Wide Swap(拓扑排序)
Atcoder 题面传送门 & 洛谷题面传送门 咦?鸽子 tzc 来补题解了?奇迹奇迹( 首先考虑什么样的排列可以得到.我们考虑 \(p\) 的逆排列 \(q\),那么每次操作的过程从逆排列的 ...
- Atcoder Grand Contest 054 题解
那天晚上由于毕业晚会与同学吃饭喝酒没打 AGC,第二天稍微补了下题,目前补到了 E,显然 AGC 的 F 对于我来说都是不可做题就没补了(bushi A 简单题,不难发现如果我们通过三次及以上的操作将 ...