关键字final和关键字static两者的含义并不相似,但是笔者常常使用一段时间后就会忘记它们之间的区别,因为它俩总是相伴着出现。当只出现其中一个时,就对其代表的含义不甚清晰了。故而特地将相关知识点记下,便于每次遗忘时查阅。

final

final关键字顾名思义代表“最后的”,意味着不能被更改。它的定义,可以概括地分为以下三点:

  1. 被final修饰的类不能被继承;
  2. 被final修饰的方法不能被重写;
  3. 被final修饰的变量不能被改变。注:引用类型的变量,引用不可变,但是引用所指向的内容是可变的

如果一个方法被final修饰,那么在编译阶段,JVM会为其寻求内联,即相当于将该方法中的语句都添加到调用该方法的代码中,去除这个方法。函数的调用是需要一定的开销的:保护现场、建立堆栈、恢复现场等,对于一些代码量不大,又频繁调用的函数来说,时空的消耗都是很大的,所以内联有助于提升Java的效率。因此如果已经确定某一个方法不会被继承,就尽量用final来修饰。

static

static关键字同样可以用于修饰类、方法和变量,但它修饰的类只能是内部类,它所修饰的方法和变量可以称为“静态方法”、“静态变量”,也可以称为“类方法”、“类变量”,后一种称呼显然更贴近于它的实际含义。相对于“类方法”、“类变量”的是“实例方法”、“实例变量”,也就是没有用关键字static修饰的方法和变量。一个类可以有很多对象(实例),对于非静态变量,每个对象都拥有,而静态变量,则是所有对象共有。

  • 静态资源是独立于类而存在的,所有实例共享,在类初始化的时候加载;
  • 非静态资源是在new一个新对象的时候加载,即生成实例的时候。

通过以上两点,可以得出:
当类只进行了初始化,还未产生实例的时候,非静态资源是未被加载出来的,因而在静态方法中引用非静态资源是错误的
当父类子类都存在静态资源和非静态资源的时候,new第一个子类对象时,调用资源的顺序是:父类静态资源 -> 子类静态资源 -> 父类构造函数 -> 子类构造函数。由于静态 资源初始化只需一次,new第二个子类对象时,调用资源的顺序就是 父类构造函数 -> 子类构造函数

static final

通常static final连用来表示常量,只需要有一份,类的所有对象都共享且不可被更改。如果只用final,则每个实例都需要存储该数据,且随着它的使用,内存不断地分配又释放。如果这个常量是一个随机生成的数据,那么每个对象创建时,它都需要随机生成一次,那么对象和对象之间,生成的数据不等,常量成了变量。


最新文章

  1. TODO:macOS编译PHP7.1
  2. 使用js实现input输入框的增加
  3. 关于vs生成app错误提示,提醒Execution failed for task ':transformClassesWithDexForDebug'.
  4. Linux学习笔记(12)用户和用户组管理
  5. KMP(fail数组应用) LA 3026 Period
  6. RAD DELPHI XE5的android开发环境配置
  7. Swift与Objective-C的对比
  8. yarn安装部署
  9. CentOS配置防火墙
  10. 深入子元素的width与父元素的width关系
  11. python伪装浏览器爬虫
  12. Java 将容器 Map中的内容保存到数组
  13. 用agular2做文件上传功能杂记-遁地龙卷风
  14. js中return false; jquery中需要这样写:return false(); Jquery 中循环 each的用法 for循环
  15. curl 文件上传
  16. 使用__all__限制模块可被导入对象
  17. C#开发Unity游戏教程之Scene视图与脚本的使用
  18. Asp.net web Control Enable 属性设置
  19. Linux(CentOS)中使用Mono+jexus部署Asp.net4.5网站
  20. python获取命令行参数 启动文件

热门文章

  1. C++零食:WTL中使用双缓冲避免闪烁
  2. Java.work7 访问权限、对象使用作业20194651
  3. 最大连续和(dp复习)
  4. WeChall_Training: Get Sourced (Training)
  5. Shiro自动登录
  6. MySql Docker的一些操作方法
  7. oneweb and starlink
  8. k8s系列---存储卷pv/pvc。configMap/secert
  9. H5浏览器强制手机横屏
  10. Vue之Vuex的使用