转(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方法就显得过于严苛了。
转(static final 和final的区别)的更多相关文章
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal
java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型 也就是 ...
- Java中 static、final和static final的特点及区别
final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行时,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期 ...
- java的static final和final的区别
转自:https://www.cnblogs.com/EasonJim/p/7841990.html 说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法 ...
- Java中static final 与 final 的区别(转载)
转自:http://advance0683.iteye.com/blog/1107732 Java中static final 与 final 的区别: 例子: Java代码 import java.u ...
- static final 和final的区别
学习java的时候常常会被修饰符搞糊涂,这里总结下static final和final的区别. static是静态修饰关键字,可以修饰变量和程序块以及类方法: 当定义一个static的变量的时候jvm ...
- Java中static、final和static final(final static)的区别(转)
大佬的总结(大赞!) final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final修饰的属性跟具体对象有关, ...
- 【Java面试题系列】:Java中final finally finalize的区别
本篇为[Java面试题系列]第三篇,文中如有错误,欢迎指正. 第一篇链接:[Java面试题系列]:Java基础知识常见面试题汇总 第一篇 第二篇链接:[Java面试题系列]:Java基础知识常见面试题 ...
- 详解详解Java中static关键字和final关键字的功能
摘要:static关键字和final关键字是Java语言的核心,深入理解他们的功能非常重要. 本文分享自华为云社区<Java: static关键字与final关键字>,原文作者:唐里 . ...
- Android源码中final关键字的用法及final,finally,finalize的区别
Android开发的学习流程 final,finally,finalize的区别 Android的发展越来越快,Android开发人员越来越多,当两种情况碰撞,在诸多开发者中跟紧Android步伐脱颖 ...
随机推荐
- 12@365 java上传文件(word、图片等)至服务器
这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用 后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下) ...
- 【HANA系列】SAP HANA SQL合并多行操作
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL合并多行 ...
- 【Lua程序设计第四版练习题答案】ch01 Lua语言入门
联系1.1: 运行阶乘的示例并观察,如果输入负数,程序会出现什么问题?试着修改代码来解决问题. -- 定义一个计算阶乘的函数 function fact (n) if n == 0 then re ...
- PJzhang:如何在裸奔的年代找到一些遮羞布
猫宁!!! 很久以前的一篇,搬过来. 我一直在“裸奔”,而且很久了,只是不太愿意承认. 想起了“皇帝的新装”,好奇何种经历和灵感让安徒生写出了如此精彩的故事. 一次百度了一个商品,不久接到了大规模电话 ...
- Spring体系
1.Spring简介 Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题.它是一个分层的JavaSE/JavaEE ...
- 配置中心 Spring Cloud config
配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储.Git以及Subversion. 1.服务端 创建spring boot 项目 主要依赖 <dependenc ...
- 关联规则(Apriori算法)
关联分析直观理解 关联分析中最有名的例子是“尿布与啤酒”.据报道,美国中西部的一家连锁店发现,男人们会在周四购买尿布和啤酒.这样商店实际上可以将尿布与啤酒放在一块,并确保在周四全价销售从而获利.当然, ...
- 设计模式:职责链模式(Chain of Responsibility)
去年参加校招要到长沙来,这个对于我来说不是特别喜欢(但又必须的来,谁叫咱不是985.211的娃呢),但是对于某些人来说就是福音了.大四还有课,而且学校抓的比较严,所以对于那些想翘课的人来说这个是最好不 ...
- Navicat 连接数据库避免中文显示乱码问题解决
在使用Navicat Premium连接数据库进行操作时,为避免出现中文乱码的问题解决: 1.连接SQL Server 在新建数据库时,常规 设置 排序规则 为 Chinese_PRC_CS_AS_W ...
- 动态树(LCT、Top Tree、ETT)
LCT Upd: 一个细节:假如我们要修改某个节点的数据,那么要先把它makeroot再修改,改完之后pushup. LCT是一种维护森林的数据结构,本质是用Splay维护实链剖分. 实链剖分大概是这 ...