关键字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. MyBatis基础_连接池与事务、动态SQL、注解开发

    一.MyBatis连接池及事务控制 1.连接池 在实际开发中,都会使用连接池,因为它可以减少获取连接缩消耗的时间.所谓连接池,就是存储数据库连接的容器.连接池中存储一定数量的数据库连接,当线程需要使用 ...

  2. 尝试用 Python 写了个病毒传播模拟程序

    病毒扩散仿真程序,用 python 也可以. 概述 事情是这样的,B 站 UP 主 @ele 实验室,写了一个简单的疫情传播仿真程序,告诉大家在家待着的重要性,视频相信大家都看过了,并且 UP 主也放 ...

  3. uniapp单页面配置无导航栏

    { "path": "pages/login/login", "style": { "navigationStyle": ...

  4. c++ 初始化列表和构造函数初始化区别

    先上代码 #include <iostream> class MyContruct { public: MyContruct() { std::cout << "My ...

  5. PYTHON 学习笔记2 流程控制工具以及函数定义、匿名函数

    前言 在上一节的学习中.已经介绍了几种基本类型.包括字符串的定义,以及字符串中索引.切片.字符串拼接的使用方法.以及基本的整形数据运算.一些之前都没有了解过的运算符.比如 ** 乘方 //整数除法等. ...

  6. debian 安装xz 命令

    # apt install -y xz-utils # xz -d Python-3.6.8.tar.xz # xz -d Python-3.6.8.tar.xz

  7. NIO学习笔记,从Linux IO演化模型到Netty—— 究竟如何理解同步、异步、阻塞、非阻塞

    我的观点 首先,分开各自理解. 1. 同步:描述两个(或者多个)个体之间的协调关系. 比如,单线程中,methodA调用了methodB,methodB返回后,methodA才往下执行,那么称A同步调 ...

  8. Spring源码阅读笔记02:IOC基本概念

    上篇文章中我们介绍了准备Spring源码阅读环境的两种姿势,接下来,我们就要开始探寻这个著名框架背后的原理.Spring提供的最基本最底层的功能是bean容器,这其实是对IoC思想的应用,在学习Spr ...

  9. 我国自主研发的先进辅助驾驶系统(ADAS)控制器产品实现量产配套

    来源: http://www.most.gov.cn/kjbgz/201710/t20171023_135606.htm 感谢对我们ADAS团队的肯定!

  10. android button的selector

    实现按钮的selector <?xml version="1.0" encoding="utf-8"?> <selector xmlns:an ...