关键字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,则每个实例都需要存储该数据,且随着它的使用,内存不断地分配又释放。如果这个常量是一个随机生成的数据,那么每个对象创建时,它都需要随机生成一次,那么对象和对象之间,生成的数据不等,常量成了变量。


final 和 static之间的区别和联系的更多相关文章

  1. Java中 final、static、abstract区别与联系

    1.static修饰符 static作用于代码块:称作静态代码块(可以初始化static field,不能初始化非static field); static作用于methods: static方法只能 ...

  2. final,finally,finalize之间的区别。

    fianl:可以修饰类.变量.方法.修饰类不能被继承,修饰变量只能赋值一次,修饰方法不能被重写. finally是try语句体中的一个语句体,不能单独使用,用来释放资源. finalize()是在ja ...

  3. Java基础-final和static的区别

    很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变.看下面这个例子: public class Test { ...

  4. Java中static、final、static final的区别(转)

    说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...

  5. Java中static、final、static final的区别【转】

    说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...

  6. Java中static、final、static final的区别(转)+transient

    说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...

  7. Java中final与 static final 修饰的常量的区别

    喵喵开车,新手上路,多多关照.有任何错误请在评论区指出. ...........................................我是万恶的分界线( • ̀ω•́ )✧......... ...

  8. Java中 static、final和static final的特点及区别

    final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行时,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期 ...

  9. Java中static、final、static final的区别

    final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期 ...

随机推荐

  1. Magicodes.IE在Docker中使用

    Magicodes.IE在Docker中使用 更新日志 2019.02.13 [Nuget]版本更新到2.0.2 [导入]修复单列导入的Bug,单元测试"OneColumnImporter_ ...

  2. Java.work6 stasic、this、包总结作业20194651

    题目一: 编写一个类Computer,类中含有一个求n的阶乘的方法.将该类打包,并在另一包中德Java文件App.java中引入包,在主类中定义Computer类的对象,调用求n的阶乘的方法(n值由参 ...

  3. pthread_cond_broadcast & pthread_cond_signal

    pthread_cond_broadcast(&cond1)的作用是唤醒所有正在pthread_cond_wait(&cond1,&mutex1)的线程. pthread_co ...

  4. VFP调整本机日期时间与服务器日期时间一致

    *!*调整本机日期时间与服务器日期时间一致( YYYY-MM-DD HH:MM:SS.FFF )*!*以下cSqlStr及nCon为SQL查询串及连接句柄cSqlStr="Select Sy ...

  5. MySQL中大数据表增加字段,增加索引实现

    MySQL中大数据表增加字段,通过增加索引实现 普通的添加字段sql ALTER TABLE `table_name` ADD COLUMN `num` int(10) NOT NULL DEFAUL ...

  6. centos7利用系统镜像修复grub

    1 故障描述 由于错误操作,导致grub配置文件失效,系统开机后一直卡在下面的画面. 2 解决办法 这时候,就要利用系统镜像光盘,进入修复模式,然后按下面图示操作 进入镜像的shell环境,如下图所示 ...

  7. [ERROR]pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]SQL Server 阻止了对组件“xp_cmdshell”的 过程“sys.xp_cmdshell”的访问

    环境: Windows 2012 R2 SQL Server 2014 通过MSSQL查询数据库服务器时间,报错如下: pyodbc.ProgrammingError: (', '[42000] [M ...

  8. 第二篇 Springboot mybatis generate根据数据库表自动生成实体类、Mapper和Mapper.xml

    源码链接:https://pan.baidu.com/s/1iP4UguBufHbcIEv4Ux4wDw 提取码:j6z9 目录结构如下:只需增加一个generatorConfig.xml文件和在po ...

  9. 基于 HTML5 和 Canvas 实现的 3D 垃圾分类系统

    前言 垃圾分类,一般是指按一定规定或标准将垃圾分类储存.分类投放和分类搬运,从而转变成公共资源的一系列活动的总称.分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用.垃圾在分类储存阶段属于公众的私 ...

  10. 使用Python批量更新服务器文件【新手必学】

    买了个Linux服务器,Centos系统,装了个宝塔搭建了10个网站,比如有时候要在某个文件上加点代码,就要依次去10个文件改动,虽然宝塔是可视化页面操作,不需要用命令,但是也麻烦,虽然还有git的h ...