final通常是指"不可改变的",例如我们使用的常量

通常可以有三种使用情况:

一、final修饰数据

  如果final修饰数据,也就是通常所说的常量,从字面上看,常量就是不能修改的,和变量是一个对立面

1、定义的时候必须有初始值,否则会编译错误

原因:

  public int i = 123;

  在类加载的准备阶段i的值为0,而不是123。赋值123的过程是在初始化阶段

  但是如果i被final修饰,编译器会生成Constantvalue属性,在准备阶段会根据Constantvalue的设置将i赋值为123

  所以,常量必须有初始值,编译器不会给它零值

空白final:

  声明为final但是没有给定初值,在构造器内进行初始化,能够保证一定的灵活性,而且符合final在使用前被初始化

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Test1 { public int i = 0;
}
public class Test {
private final int i;
private final Test1 test1;
public Test() {
i = 0;
test1 = new Test1();
}
public Test(int i) {
this.i = i;
test1 = new Test1(i);
}
}

PS:常量并不是在编译期就能知道它的值,可以在运行时生成的

2、修饰对象引用

  final修改引用的时候和修饰基本数据类型有差别

2.1).修饰基本数据类型:数值不能修改

2.2).修改引用类型:

  final修饰的引用初始化的时候指向一个对象之后,就不会指向别的对象。被指向的对象是可以修改的

public class Test1 {

    public int i = 0;
}

3、final参数

  和一般修饰数据和引用没有什么区别,主要匿名内部类中使用,会在后面讲

下面的"常量和变量的区别",内容来自:https://www.cnblogs.com/dolphin0520/p/3736238.html,也推荐大家去看,内容更加详细

常量和普通变量的区别?

public class Test {
public static void main(String[] args) {
String a = "hello2";
final String b = "hello";
String d = "hello";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));
System.out.println((a == e));
}
}

结果:true,false,这就是区别了

PS:只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化

public class Test {
public static void main(String[] args) {
String a = "hello2";
final String b = getHello();
String c = b + 2;
System.out.println((a == c)); } public static String getHello() {
return "hello";
}
}

结果:false

二、final修饰方法

使用final修饰方法的原因有两个:

1、防止方法被重写

2、效率:早期Java对final方法进行优化

private方法默认也是final,是否加上final都是无所谓的

public class Test {

    private void f1() {

    }
}
public class Test1 extends Test{ private void f1() { }
}

这种场景并不是重写

三、final修饰类

  如果final修饰类的时候,表示该类无法被继承,某种情况下,这是出于安全考虑,不希望有子类。

所有方法都会被隐式指定为final

Java基础(三)--final关键字的更多相关文章

  1. Java基础(三)-final关键字分析

    今天来谈谈final关键字的作用, 虽然有很多博文关于final进行了很深的研究,但还是要去记录下谈谈自己的见解加深下印象.下面直接进入主题: 一.final关键字的作用 1.被final修饰的类不能 ...

  2. Java基础(五) final关键字浅析

    前面在讲解String时提到了final关键字,本文将对final关键字进行解析. static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提 ...

  3. 【Java基础】final关键字总结

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

  4. Java基础系列--final关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8482909.html 一.概述 final是Java关键字中最常见之一,表示"最 ...

  5. java 基础 1 final关键字

    1. final关键字 数据:声明数据为常量,对于基本类型final使数值不变,对于引用类型final使引用不变,但引用所指向的值是可以改变的,例如       final StringBuffer ...

  6. java基础之final关键字

    final: 意为终态.在java中得注意以下四点: 1.final是一个修饰符,可修饰变量,方法,类. 2.final修饰子类不可以被继承. 3.final修饰的方法不可以被重写(覆盖) 4.对于一 ...

  7. Java基础——深入理解Java中的final关键字(转载)

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

  8. 简单聊聊java中的final关键字

    简单聊聊java中的final关键字 日常代码中,final关键字也算常用的.其主要应用在三个方面: 1)修饰类(暂时见过,但是还没用过); 2)修饰方法(见过,没写过); 3)修饰数据. 那么,我们 ...

  9. Java基础-标识符与关键字

    Java基础-标识符与关键字 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是标识符 标识符就是程序员在编写程序时,给类,变量,方法等起的名字. 二.标识符的命名规则 1& ...

随机推荐

  1. 【HNOI模拟By lyp】Day1

    1 xlk1.1 题目描述 给定一棵大小为 n 的无根树,求满足以下条件的四元组 (a, b, c, d) 的个数: 1. 1 ≤ a < b ≤ n 2. 1 ≤ c < d ≤ n 3 ...

  2. POJ 2590:Steps

    Steps Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7872   Accepted: 3612 Description ...

  3. MAMP/xampp安装redis

    nmp/amp/xampp安装redis 一.安装redis服务 1.通过homebrew安装redis sudo brew install redis 2.启动redis服务,且接受客户端连接 su ...

  4. JeePlus:代码结构

    ylbtech-JeePlus:代码结构 1.返回顶部 1. 代码结构 1.文件结构 1.1.源码目录 src/main/javacom.jeeplus Jeeplus目录录├ common 公共模块 ...

  5. oracle从子表取出前几行数据:

    取排序后的前几行,应该用: select * from(select * from test order by stamp desc) where rownum<= 6  (表示排序后取前几行) ...

  6. bzoj 1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果【tarjan+记忆化搜索】

    对这个奇形怪状的图tarjan,然后重新连边把图变成DAG,然后记忆化搜索即可 #include<iostream> #include<cstdio> using namesp ...

  7. 洛谷 P1462 通往奥格瑞玛的道路(spfa+二分搜索)(4boy)

    原题:http://www.luogu.org/problem/show?pid=1462#sub 4boy: 大意:给出n个城市,有m条路,每经过一个城市都要交钱,每经过一条道路都要扣HP,有HP上 ...

  8. php+ajax+jquery实现jsonp跨域

    我们有这么个html文件test.html: 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  9. [SDOI2010]外星千足虫(高斯消元)

    高斯消元裸题... 方法一:暴力,O(2^n)20分 方法二:直接Gauss,加点玄学技巧搞得好的话70分 方法三:使用bitset优化,复杂度:$O(\frac{n^3}{ω})$ 不会的同学看一下 ...

  10. less新手入门(一) 变量、extend扩展

    前景提要 个人在学习less时候的学习笔记及个人总结,主要是结合less中文网来学习的,但是说是中文网并不是中文呀,看起来很耽误时间,为了避免以后再次看的时候还要翻译思考,特意做此总结,方便以后查阅. ...