Java基础(三)--final关键字
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关键字的更多相关文章
- Java基础(三)-final关键字分析
今天来谈谈final关键字的作用, 虽然有很多博文关于final进行了很深的研究,但还是要去记录下谈谈自己的见解加深下印象.下面直接进入主题: 一.final关键字的作用 1.被final修饰的类不能 ...
- Java基础(五) final关键字浅析
前面在讲解String时提到了final关键字,本文将对final关键字进行解析. static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提 ...
- 【Java基础】final关键字总结
Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...
- Java基础系列--final关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8482909.html 一.概述 final是Java关键字中最常见之一,表示"最 ...
- java 基础 1 final关键字
1. final关键字 数据:声明数据为常量,对于基本类型final使数值不变,对于引用类型final使引用不变,但引用所指向的值是可以改变的,例如 final StringBuffer ...
- java基础之final关键字
final: 意为终态.在java中得注意以下四点: 1.final是一个修饰符,可修饰变量,方法,类. 2.final修饰子类不可以被继承. 3.final修饰的方法不可以被重写(覆盖) 4.对于一 ...
- Java基础——深入理解Java中的final关键字(转载)
Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...
- 简单聊聊java中的final关键字
简单聊聊java中的final关键字 日常代码中,final关键字也算常用的.其主要应用在三个方面: 1)修饰类(暂时见过,但是还没用过); 2)修饰方法(见过,没写过); 3)修饰数据. 那么,我们 ...
- Java基础-标识符与关键字
Java基础-标识符与关键字 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是标识符 标识符就是程序员在编写程序时,给类,变量,方法等起的名字. 二.标识符的命名规则 1& ...
随机推荐
- Python 批量修改root密码
#_*_coding:utf8_*_ from multiprocessing import Process, Pool import paramiko import sys,os host_list ...
- HDU 5324 Boring Class【cdq分治】
这就是一个三维排序的问题,一维递减,两维递增,这样的问题用裸的CDQ分治恰好能够解决. 如同HDU 4742(三维排序,一个三维都是递增的) 由于最小字典序比較麻烦,所以要从后面往前面做分治.每一个点 ...
- Class 与 new的配合使用
class Type{ // 定义新的类型Type /// ...... }; Type a; Type b; // 像int a; int b;那样使用, 定义a和b为Type类型的变量 in ...
- Android学习笔记-listview实现方式之BaseAdapter
listview是Android开发中最为常用的组件,这里我们就学习一下用BaseAdapter的方式实现listview, 主布局activity_main.xml是这样的: <LinearL ...
- [RK3288][Android6.0] 调试笔记 --- 录音音量从HAL到APP层会变小问题【转】
本文转载自:http://blog.csdn.net/kris_fei/article/details/72783843?locationNum=9&fps=1 Platform: Rockc ...
- flash、flex builder、flash builder、 air的关系
flash VS flex builder flash被adobe收购的时候是flash8,已经可以AS2面向对象了. 而被adobe收购后,adobe准备把flash打造成一个开发工具.就比如JBU ...
- 解决 django 中 mysql gone away 的问题
最近在项目中,我使用 Django Command 模块写了一个脚本,处理从 MQ 发来的消息,并入库.在测试过程中,程序运行良好,但是在程序上线并运行一段时间后,出现了以下错误: Operation ...
- 小记 vue 打包(build)需要注意的一些事
记录 vue 项目打包的一些事情 首先声明项目都是由 vue-cli 生成; vue 项目从 dev 切换到 prod 时有很多地方需要注意; 首先是大家最需要注意的 ajax 切换环节 以前一开始用 ...
- Java多线程(六)守护进程
守护进程:当进程中不存在非守护线程了,则守护线程自动销毁: public class DaemonThread extends Thread{ private int i =0; public voi ...
- markdown 常用语法总结 - 个人版
这里并不是要总结所有的 markdown 语法,只是总结笔者自己撰写博客时常用的一些 markdown 语法. 1 图片设置 1.1 设置图片位置 利用markdown在编写文档时插入图片是默认靠左, ...