final 和 static之间的区别和联系
关键字final和关键字static两者的含义并不相似,但是笔者常常使用一段时间后就会忘记它们之间的区别,因为它俩总是相伴着出现。当只出现其中一个时,就对其代表的含义不甚清晰了。故而特地将相关知识点记下,便于每次遗忘时查阅。
final
final关键字顾名思义代表“最后的”,意味着不能被更改。它的定义,可以概括地分为以下三点:
- 被final修饰的类不能被继承;
- 被final修饰的方法不能被重写;
- 被final修饰的变量不能被改变。注:引用类型的变量,引用不可变,但是引用所指向的内容是可变的
如果一个方法被final修饰,那么在编译阶段,JVM会为其寻求内联,即相当于将该方法中的语句都添加到调用该方法的代码中,去除这个方法。函数的调用是需要一定的开销的:保护现场、建立堆栈、恢复现场等,对于一些代码量不大,又频繁调用的函数来说,时空的消耗都是很大的,所以内联有助于提升Java的效率。因此如果已经确定某一个方法不会被继承,就尽量用final来修饰。
static
static关键字同样可以用于修饰类、方法和变量,但它修饰的类只能是内部类,它所修饰的方法和变量可以称为“静态方法”、“静态变量”,也可以称为“类方法”、“类变量”,后一种称呼显然更贴近于它的实际含义。相对于“类方法”、“类变量”的是“实例方法”、“实例变量”,也就是没有用关键字static修饰的方法和变量。一个类可以有很多对象(实例),对于非静态变量,每个对象都拥有,而静态变量,则是所有对象共有。
- 静态资源是独立于类而存在的,所有实例共享,在类初始化的时候加载;
- 非静态资源是在new一个新对象的时候加载,即生成实例的时候。
通过以上两点,可以得出:
当类只进行了初始化,还未产生实例的时候,非静态资源是未被加载出来的,因而在静态方法中引用非静态资源是错误的
当父类子类都存在静态资源和非静态资源的时候,new第一个子类对象时,调用资源的顺序是:父类静态资源 -> 子类静态资源 -> 父类构造函数 -> 子类构造函数。由于静态 资源初始化只需一次,new第二个子类对象时,调用资源的顺序就是 父类构造函数 -> 子类构造函数
static final
通常static final连用来表示常量,只需要有一份,类的所有对象都共享且不可被更改。如果只用final,则每个实例都需要存储该数据,且随着它的使用,内存不断地分配又释放。如果这个常量是一个随机生成的数据,那么每个对象创建时,它都需要随机生成一次,那么对象和对象之间,生成的数据不等,常量成了变量。
final 和 static之间的区别和联系的更多相关文章
- Java中 final、static、abstract区别与联系
1.static修饰符 static作用于代码块:称作静态代码块(可以初始化static field,不能初始化非static field); static作用于methods: static方法只能 ...
- final,finally,finalize之间的区别。
fianl:可以修饰类.变量.方法.修饰类不能被继承,修饰变量只能赋值一次,修饰方法不能被重写. finally是try语句体中的一个语句体,不能单独使用,用来释放资源. finalize()是在ja ...
- Java基础-final和static的区别
很多时候会容易把static和final关键字混淆,static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变.看下面这个例子: public class Test { ...
- Java中static、final、static final的区别(转)
说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...
- Java中static、final、static final的区别【转】
说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...
- Java中static、final、static final的区别(转)+transient
说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...
- Java中final与 static final 修饰的常量的区别
喵喵开车,新手上路,多多关照.有任何错误请在评论区指出. ...........................................我是万恶的分界线( • ̀ω•́ )✧......... ...
- Java中 static、final和static final的特点及区别
final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行时,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期 ...
- Java中static、final、static final的区别
final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期 ...
随机推荐
- FFMPEG学习----使用SDL构建视频播放器
#include <stdio.h> #include <string.h> extern "C" { #include "libavcodec/ ...
- 64位Win7下用VS2010编译OpenSSL
http://blog.csdn.net/henter/article/details/8364532 首先要说明,如果不想自己编译OpenSSL,可以到 http://slproweb.com/pr ...
- 设计模式——Adapter Pattern 适配器模式
我第一次接触设计模式,选取了四大类型里面的结构型,这类型的特点是关注类&对象之间的组合(使用继承),我从中选取适配器模式来具体学习. 一.适配器模式(Adapter Pattern)定义: 适 ...
- Dapper系列 作者:懒懒的程序员一枚
Dapper 第一篇简单介绍什么是小巧玲珑?Dapper如何工作安装需求方法参数结果常用类型 Dapper 第二篇 Execute 方法介绍描述存储过程Insert语句Update语句Delete语句 ...
- Go语言实现:【剑指offer】栈的压入、弹出序列
该题目来源于牛客网<剑指offer>专题. 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5 ...
- 二. 大数据常用的算法和数据结构 <<大数据日知录>> 读书笔记
基本上是hash实用的各种举例 布隆过滤器 Bloom Filter 常用来检测某个原色是否是巨量数据集合中的成员,优势是节省空间,不会有漏判(已经存在的数据肯定能够查找到),缺点是有误判(不存在的数 ...
- Python3(十一) 原生爬虫
一.爬虫实例 1.原理:文本分析并提取信息——正则表达式. 2.实例目的:爬取熊猫TV某个分类下面主播的人气排行 分析网站结构 操作:F12查看HTML信息,Ctrl+Shift+C鼠标选取后找到对应 ...
- javascript 客户端webSocket示例
//html <script> // 初始化一个 WebSocket 对象 var ws = new WebSocket("ws://localhost:9998/echo&qu ...
- 前端html,css考点
1, 内联元素,块级元素相关知识点 参考链接:https://edu.aliyun.com/a/103378 (1)置换元素 概念:浏览器根据元素的标签和属性,来决定元素的具体显示内容.<img ...
- 初识matlab
1 matlab概貌 MATLAB是MATrix LABoratory(矩阵实验室)的缩写,是一款由美国The MathWorks公司出品的商业数学软件.matlab是一种用于算法开发.数据可视化.数 ...