一、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关键字的更多相关文章

  1. JAVA面向对象-----final关键字

    JAVA面向对象-–final关键字 1:定义静态方法求圆的面积 2:定义静态方法求圆的周长 3:发现方法中有重复的代码,就是PI,圆周率. 1:如果需要提高计算精度,就需要修改每个方法中圆周率. 4 ...

  2. 聊聊Java的final关键字

    Java的final关键字在日常工作中经常会用到,比如定义常量的时候.如果是C++程序员出身的话,可能会类比C++语言中的define或者const关键字,但其实它们在语义上差距还是挺大的. 在Jav ...

  3. java 对 final 关键字 深度理解

    基础理解 : 1.修饰类 当用final去修饰一个类的时候,表示这个类不能被继承.处于安全,在JDK中,被设计为final类的有String.System等,这些类不能被继承 .注意:被修饰的类的成员 ...

  4. 关于java中final关键字与线程安全性

    在Java5中,final关键字是非常重要而事实上却经常被忽视其作为同步的作用.本质上讲,final能够做出如下保证:当你创建一个对象时,使用final关键字能够使得另一个线程不会访问到处于" ...

  5. java之final关键字

    final关键字(可以读不可以写.只读) 1.final的变量的值不能够被改变 ①.final的成员变量 ②.final的局部变量(形参) //意思是“实参”一旦传进我的方法里面,就不允许改变 2.f ...

  6. Java的final关键字详解

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  7. java中final 关键字的作用

    final 关键字的作用 java中的final关键字可以用来声明成员变量.本地变量.类.方法,并且经常和static一起使用声明常量. final关键字的含义: final在Java中是一个保留的关 ...

  8. Java并发——synchronized关键字

    前言: 只要涉及到Java并发那么我们就会考虑线程安全,实际上能够实现线程安全的方法很多,今天先介绍一下synchronized关键字,主要从使用,原理介绍 一.synchronized的使用方法 1 ...

  9. Java基础 -- final关键字

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...

随机推荐

  1. 一起学Blazor WebAssembly 开发(2)

    上篇文章讲了Blazor的两种模式的区别及各自的使用场景,本篇就开始学习WebAssembly模式,本篇主要学习的是创建项目及认识项目结构: 创建项目 选择Blazor应用 选择WebAssembly ...

  2. python爬虫入门(5)----- 阿里巴巴供应商爬虫

    阿里巴巴供应商爬虫# 起因## 学了爬虫入门之后,打算找一个有难度的网站来实践,一开始打算找淘宝或者天猫(业界老大)来实践,但后续发现网上已经有很多这方面的项目,于是瞄上了阿里的国际网站阿里巴巴.开始 ...

  3. Flutter + Android 混合开发

    JIT (Just In Time) 即时编译器, 边执行边编译 程序运行时,JIT 编译器选择将最频繁执行的方法编译成本地代码.运行时才进行本地代码编译而不是在程序运行前进行编译 AOT可以理解为“ ...

  4. 趣学Python编程PDF高清完整版免费下载|百度网盘

    百度网盘:趣学Python编程PDF高清完整版免费下载 提取码:ts47 内容简介 python是一款解释型.面向对象.动态数据类型的高级程序设计语言.python语法简捷而清晰,具有丰富和强大的类库 ...

  5. Golang语言排序的几种方式

    1.Ints,float64s,strings 使用以如函数实现基本类型 sort.Ints sort.Float64s sort.Strings s := []int{4, 2, 3, 1} sor ...

  6. getprop与dumpsys命令

    拿到Android手机以后, 想查看一些手机信息. 其实Android获取手机信息就是两个命令, 一个是getprop 一个是dumpsys. dumpsys iphonesubinfo Phone ...

  7. lua中 table.getn(t) 、#t、 table.maxn(t) 这三个什么区别?

    lua中 table.getn(t) .#t. table.maxn(t) 这三个什么区别? RTlocal t = {1,888,x= 999,b=2,5,nil,6,7,[10]=1,8,{z = ...

  8. python学习笔记1 -- 函数式编程之高阶函数 使用函数作为返回值

    使用函数作为返回值,看起来就很高端有木有,前面了解过函数名本身就是一个变量,就比如abs()函数,abs只是变量名,而abs()才是函数调用,那么我们如果把ads这个变量作为返回值返回会怎么样呢,这就 ...

  9. PHP fgetcsv() 函数

    定义和用法 fgetcsv() 函数从打开的文件中解析一行,校验 CSV 字段. fgetcsv() 函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止返回一个新行. 该函数如果成功 ...

  10. ZROI 提高十连测 DAY3

    由于我不太会写 觉得从比赛开始就冷静分析.然后看完三道题心态有点爆炸没有紧扣题目的性质. 这个心态是不可取的尽量不要有畏难心理 不要草草的写暴力. LINK:[最长01子序列](http://zhen ...