转(static final 和final的区别)
学习java的时候常常会被修饰符搞糊涂,这里总结下static final和final的区别。
1、static 强调只有一份,final 说明是一个常量,final定义的基本类型的值是不可改变的,但是fianl定义的引用对象的值是可以改变的,下面举个例子来说明:
package DifStaticFinalAndFinal;class SelfCounter {private static int counter;private int id=counter++;public String toString(){return "SelfCounter: "+id;} }
package DifStaticFinalAndFinal;class WithFinalFields {static final SelfCounter wffs=new SelfCounter();final SelfCounter wff=new SelfCounter();public String toString(){return "wff= "+wff+",\n wffs= "+wffs;} }
主函数:
package DifStaticFinalAndFinal;public class StaticFinal {public static void main(String[] args) {System.out.println("First Object:");System.out.println(new WithFinalFields());System.out.println("Second Object:");System.out.println(new WithFinalFields());} }
运行结果:
First Object: wff= SelfCounter: 1,wffs= SelfCounter: 0 Second Object: wff= SelfCounter: 2,wffs= SelfCounter: 0
分析为什么wff两次的运行结果不同,而wffs两次的运行结果相同?
因为wffs这个容器是用static final来定义的,static 强调只有一份,因此只有一个值,
而final修饰的引用是可以变化的,因此wff的值是可以变化的,这也是final修饰基本类型和引用的不同。
2、在方法中将参数指明为final时,在使用该方法时,可以读参数但是无法使用该参数。
package cn.qdu.chapter7_example;public class FinalArguments {void with(final Gizmo g){}void without(Gizmo g){g=new Gizmo();g.spin();}int g(final int i){return i+1;}public static void main(String[] args) {FinalArguments bf=new FinalArguments(); bf.with(null);//不管这里的参数换成什么,都是执行void(final Gizmo g)方法,无法更改参数bf.without(null);} }
3、为什么使用final方法呢?
原因有两个。其一是把方法锁定,确保在继承中使用方法行为不变,并且不会被覆盖;
其二是效率,如果一个方法指明为final,就是同意编译器将针对该方法的所有调用都转为内嵌调用。 转为内嵌调用的目的是节省开销,因为编译器发现一个final方法调用命令时,会跳过程序代码这种正常方式而执行方法调用机制(将参数压入栈,跳至方法代码处并执行,然后跳回并清理栈中的参数,处理返回值),并且以方法体中的实际代码的副本来替代方法调用。但是如果一个方法很大,程序很膨胀,就会看不到内嵌带来的任何性能的提高。
4、final和private关键字
类中所有private方法都隐式地指定为是final的,因为private关键字只能被本类调用,其他类中的方法也无法覆盖private修饰的方法,因此和加上final效果是一样的。
5、当某个类的整体定义为final时,表明该类不能被继承,方法不能被覆盖,且final类中的所有方法都隐式指定为是final的,方法声明为final后还可以有效地“关闭”动态绑定。
6、static加载类的动作只发生一次。
最后,说了这么多,也要对final做一个客观的评价。若方法或类不想让别人来继承和修改,设定为final是明智的,但是在团体中这样会阻碍其他程序员通过你想不到的合理的途径来复用类,这样的话final方法就显得过于严苛了。
转载于:https://www.cnblogs.com/tzhyy/p/9199403.html
转(static final 和final的区别)相关推荐
- 详解Java中static关键字和final关键字的功能
摘要:static关键字和final关键字是Java语言的核心,深入理解他们的功能非常重要. 本文分享自华为云社区<Java: static关键字与final关键字>,原文作者:唐里 . ...
- final,finally,finaliz的区别(Java)
final,finally,finaliz的区别(Java) final-修饰符(关键字) 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 a ...
- final 、finally的区别
final .finally 开发工具与关键技术:工具:myeclipse 技术: final .finally 作者:吴东梅 撰写时间:2019-05-11 final和finally单词书写相似, ...
- Android源码中final关键字的用法及final,finally,finalize的区别
Android开发的学习流程 final,finally,finalize的区别 Android的发展越来越快,Android开发人员越来越多,当两种情况碰撞,在诸多开发者中跟紧Android步伐脱颖 ...
- php static 和 global,php中global static和$GLOBALS使用与区别
本文章来总结介绍关于php中global static和$GLOBALS使用与区别有需要了解他们三区别的朋友可参考参考. 1.global在整个页面起作用. 例1 代码如下 复制代码 global ...
- C# static readonly 与 const 的区别
static readonly 与 const 的区别: const 表达式的值是在编译时形成的: static readonly 表达式的值直到程序运行时才形成: 转载于:https://www.c ...
- final 实例域+final类+final方法(阻止继承)
[0]README 0.1)本文描述+源代码均 转自 core java volume 1, 旨在理清 "final 实例域": 0.2) 最后还增加了 阻止继承 的内容,涵盖了f ...
- php new static,PHP中new static()与new self()的区别异同分析
本文实例讲述了PHP中new static()与new self()的区别异同,相信对于大家学习PHP程序设计能够带来一定的帮助. 问题的起因是本地搭建一个站.发现用PHP 5.2 搭建不起来,站PH ...
- PHP 中 new static 和 new self 的区别
今天老大在公司 问了一下 new static 和 new self 的区别 公司十个程序 竟然没有一个回答上来 后面画面自补 ... 本屌丝回家后 就百度了解了下 这二者区别 : ...
- static全局变量和普通全局变量区别?static局部变量和普通局部变量区别?static函数和普通函数区别
几者的区别从三个方面考虑: 1初始化时间 2 作用域 3 分配内存空间 static全局变量和普通全局变量区别: 区别: 1.static全局变量编译是初始化,在main()函数之前初始化并且仅初始化 ...
最新文章
- PC行业为何需要华为们被搅局?
- 调整模型 与 提纯样本的关系过程有点类似EM算法过程,不知道这样理解是否是正确理解,固定A调B,B调到最优后,固定B再调A,循环往复,直至最优。
- 简单的点击展开/关闭效果
- python大神-python大神教你在最短时间内学会爬取大规模数据
- java8新特性之lambda表达式(及方法引用与构造器引用)
- bzoj 1191 [HNOI2006]超级英雄Hero
- 记录docker-Skywalking集成es7异常处理
- about the libiconv.2.dylib
- 手机python编程文件如何转文档_Python 开发者面向文档编程的正确姿势
- 错失黄金时期、连年亏损,国美App改名也难“真快乐”
- 【HTML——代码雨】(效果+代码)
- react中p标签_React 2020 p1简介和安装
- 两种方式打开jar文件
- django 一个项目多个App项目搭建
- windows系统服务器如何修改登录密码
- 微信小程序|使用小程序制作一个足球拼图小游戏
- 不到最后,你永远不知道会发生什么
- 猫耳FM音频转换成MP3格式
- 2022-2028全球丁二磺酸腺苷蛋氨酸(SAMe)行业调研及趋势分析报告
- ESP8266_02程序的编译与下载