引言

final 关键字和 c# 中的 sealed 关键字比较像,和 static 一样,它可以用来修饰类、变量和方法;final顾名思义,最后的最终的,所以用它修饰的类、变量和方法不可以改变;

下面就从类、方法和变量三个方面分别介绍一下final关键字的作用和用法;

final类

final修饰的类无法被继承

测试代码:

// final修饰的类无法被继承
final class Person {String name;
}
// Students类无法继承由final修饰的Person,编译不通过:
// FinalTest01.java:6: 错误: 无法从最终Person进行继承
class Students extends Person {String StuId;
}

用final修饰类就是为了不让其他类继承它,这样就可以防止子类重写父类方法或者随意改动父类变量了;

final方法

final修饰的方法无法被覆盖(重写),但是可以重载;

测试代码:

// final修饰的方法无法被覆盖
class Person {final void walking() {System.out.println("I am walking");}// 重载void walking(String name) {System.out.println("I am walking");}
}
class Students extends Person {/*父类中final修饰了walking方法,所以子类重写walking方法就无法覆盖,编译报错:FinalTest02.java:17: 错误: Students中的walking()无法覆盖Person中的walking()*/void walking() {System.out.println("Student is walking");}// 但是重载的还是可以编译的void walking(String name) {System.out.println("Student is walking");}
}

final方法主要作用也就是防止子类重写父类的某个方法;

final变量

final修饰的变量只能赋值一次
这里把final修饰变量的情况分为三种,依次是实例变量,静态变量,引用变量
局部变量用法差不多一样,这里就不提了;

final修饰实例变量

final修饰的实例变量,系统不会自动赋默认值,要求程序员必须手动赋值
可以在

  1. 非静态初始化块
  2. 声明该实例变量
  3. 构造器

中赋值;

测试代码:

class Person {{idNum = "123456"; // 非静态初始化块中赋值}final String idNum;final String name = "张三"; // 声明时赋值final int age;// final修饰的weight实例变量,系统不会默认赋值,所以编译错误:// FinalTest03.java:15: 错误: 可能尚未初始化变量weight// final int weight;Person() {age = 18; // 构造器中赋值}
}
public class FinalTest03 {public static void main(String[] args) {Person p = new Person();System.out.println("idNum=" + p.idNum);System.out.println("name=" + p.name);System.out.println("age=" + p.age);}
}

输出结果:

idNum=123456
name=张三
age=18

final修饰静态变量(类变量)

实例变量既然用 final 修饰,那么该实例变量值不会随着对象变化而改变,既然这样,没有必要声明为实例变量,最好声明为静态变量,这样更节省内存(因为实例变量是在堆区一个对象一份,而类变量是在方法区一个一份)

语法:static final 或者 final static ,这样修饰变量又称为 常量

可以在

  1. 静态初始化块
  2. 声明该静态变量

中赋值

常量名建议全部字母大写,单词之间以下划线连接

测试代码:

class Person {static {ID_NUM = "123456"; // 静态初始化块中赋值}public final static String ID_NUM;public final static String NAME = "张三"; // 声明静态变量时赋值
}
public class FinalTest04 {public static void main(String[] args) {Person p = new Person();System.out.println("ID_NUM=" + p.ID_NUM);System.out.println("NAME=" + p.NAME);}
}

输出结果:

ID_NUM=123456
NAME=张三

常量一般就是public权限了,因为谁都修改不了它

final修饰引用变量

final修饰引用变量,同样也只能赋值一次,但是所赋的值是一个对象的地址,即该引用变量只能指向一个对象,并且永远指向该对象;
但是该对象内的数据依然可以修改

测试代码:

class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}
}
public class FinalTest05 {public static void main(String[] args) {// final修饰引用变量pfinal Person p = new Person("张三", 18);Person p2 = new Person("李四", 20);// p引用变量一旦赋值无法改变,编译错误:// FinalTest05.java:17: 错误: 无法为最终变量p分配值// p = p2;// FinalTest05.java:19: 错误: 无法为最终变量p分配值// p = null;System.out.println("name=" + p.name);System.out.println("age=" + p.age);// 引用变量p指向的是一个对象,不能改变// 但是该对象可以任意改变p.name = p2.name;p.age = p2.age;System.out.println("name=" + p.name);System.out.println("age=" + p.age);}
}

输出结果:

name=张三
age=18
name=李四
age=20

总结

final关键字的使用主要就是这几种情况,总结下来也就是这几句话:

  • final修饰的类无法被继承
  • final修饰的方法无法被覆盖(重写),但是可以重载;
  • final修饰的变量只能赋值一次

而修饰变量时又有四种情况,但是不论如何核心还是只能赋值一次;

ps:如果内容有问题欢迎交流!

Java中的关键字——final相关推荐

  1. Java 中的关键字 final

    final  根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解 ...

  2. 随笔② Java中的关键字 --- final关键字

    一:final关键字 ① final变量:凡是对成员变量或者本地变量(在方法中的或者代码块中的变量称为本地变量)声明为final的都叫作final变量.final变量经常和static关键字一起使用, ...

  3. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题

    先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...

  4. java transient_【转】Java中的关键字 transient

    阅读目录 先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的 ...

  5. java关键字 valotile_Java内存模型-jsr133规范介绍,java中volatile关键字的含义

    最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...

  6. java中static、final 和 static final之间的区别

    java中static.final 和 static final之间的区别 static可以修饰:全局属性,方法,代码块,内部类(静态内部类或嵌套内部类) 由于静态属性和方法是属于该类的所有对象的,所 ...

  7. java中的关键字英汉

    java中的关键字 初入java记录贴 类: enum(枚举).interface(接口).class(类).extends(继承).implements(实现接口) 对象: new(创建).inst ...

  8. 【Java_基础】Java中Native关键字的作用

    本篇博文转载与:Java中Native关键字的作用 转载于:https://www.cnblogs.com/leiblog/p/10529056.html

  9. java中的关键字static

    原文链接: https://zhuanlan.zhihu.com/p/70110497 昨晚面试中被问到,没能回答出来.这篇答疑文章写得非常好,无一字可增删,遂直接复制. 在平时开发当中,我们经常会遇 ...

最新文章

  1. 工业机器人抓取时怎么定位的?用什么传感器来检测?
  2. Fedora Core 4配置本地yum源
  3. python之torchlight使用_为什么Python被誉为全世界最高效的编程语言?
  4. 如何在Pandas中使用Excel文件
  5. Toolbox的Ajax Extensions Tab不见了
  6. Swift 的变化:从 2.2 到 3.0 会带来什么
  7. 刚进职场的新人,这6点一定要牢记
  8. JavaScript等同于printf / String.Format
  9. C++添加一个头文件和extern以及全局变量和局部变量问题(清C++蓝书16.3.19上机的一小题)...
  10. [Visual Studio] VS2012调试时很慢的解决方案
  11. 【Prison Break】第七天(4.3)
  12. Excel文件下载From Linux
  13. Win7英伟达控制面板点击没有反应的解决办法
  14. java中的IO整理(上)(微信文章)
  15. 人脸脸部识别技术_面部识别技术的道德安全问题
  16. yyds、yygq、xswl...都是什么意思?
  17. 数据库中文字段按拼音排序
  18. 业内首发 | 区块链数据服务 - BDS
  19. ipguard客户端如何卸载_关于卸载Oracle步骤和相关SQL的学习
  20. 认知的高度 = 人生的高度

热门文章

  1. opencv4 c++ 提取图片中的白色区域_【从零学习OpenCV 4】形态学应用
  2. 律师如何加强自身的计算机文化教育网,提高_计算机文化基础_教学效果的几点心得.pdf...
  3. 数据中心UPS电源节能降耗的四大原则
  4. 刷新你的数据中心冷却词汇
  5. 2246xt u盘开卡详细教程_U盘制作PE及系统安装详细教程!
  6. Py之pandas:对dataframe型数据排序相关的问题总结之按照多个字段的多个条件进行排序(先打乱再排序)
  7. 成功解决A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,co
  8. 成功解决ValueError: DataFrame.dtypes for label must be int, float or bool
  9. 成功解决 利用plt.plot绘图时,横坐标出现浮点小数而不是整数的情况(坐标轴刻度)
  10. DL之DNN:自定义2层神经网络TwoLayerNet模型(封装为层级结构)利用MNIST数据集进行训练、预测