当前位置: 首页 > 编程日记 > 正文

深入java_深入Java Final

JAVA关键字final用于修饰数据、方法或类,通常意味着“无法改变的”,既数据不能改变,方法不能覆盖,类不能继承。一般采用final有两种原因:设计和效率。而随着JAVA版本的更新,一些效率上的问题可以交由编译器和JVM处理。因此,采用final来解决效率问题就显得不是那么重要了。

Final修饰符大多运用于基本数据类型(primitive)域或者不可变(immutable)类的域(如果类中的所有方法方法都不会改变其对象,这种类就是不可变类。String就是一个不可变类)。

【final数据】

Final关键字用修饰数据主要有两种情况:

1. 编译期常量

2. 运行时初始化的值

对于编译期常量,指的是一个既是final又是static的域(依照惯例,编译期常量全部用大写字母命名,并且用下划线分隔各个单词),它只占据一段不能改变的存储空间。编译器可以将编译期常量代入到任何可能用到它的计算式中,也就是说,可以在编译时执行计算式,这相对减轻了运行时负担。编译期常量在定义时必须对它赋值(不一定是基本类型)。

运行时初始化的值,对于基本类型,final使得其值不可改变;而对于对象引用,final使得引用不可改变,即无法将其改为指向另一个对象,然而,对象本身却可以修改(适用于数组,数组也是对象)。

public class javaFinalData{

private static final String TESTD = "test";

public static final String TESTE = "test";

public static final String[] TESTF = {"1","2"}; //非基本类型

private static final String[] TESTG = new String[2];

public static void main(String args[]){

final int testA = 1;

final String testB = "test";

final int[] testC = {1,1,2,};

System.out.println(testC[1]);

testC[1] = 123;

System.out.println(testC[1]);

}

}

【未赋值的final域】

JAVA允许生成未赋值的final域,但是必须在域的定义处或者每个构造器中对final域进行赋值(有多少个构造器就必须赋值几次),确保在使用前被初始化。采用这种方式,可以使得final运用得更加灵活,在同一个类中,根据不同的对象赋予不同的值,却又保持不可改变的特性。

public class javaBlankFinal{

private final int blank;

public javaBlankFinal(){

blank = 2011;

}

public javaBlankFinal(int temp){

blank = 2012;

}

public javaBlankFinal(String temp){

blank = 2014;

}

public static void main(String args[]){

new javaBlankFinal();

}

}

【final方法】

使用final方法有两方面原因:一是将方法锁定,防止方法被覆盖,确保在继承中方法行为保持不变;二是将方法调用转为内联调用(inlining),以减少方法调用的开销。但是,在最近的版本中,JVM可以自行进行优化,因此无需使用final方法来处理效率问题。

关于final方法,还有一点需要注意,类中所有的private方法都隐式地指定为final方法(也可以为其加上final修饰,但没有意义)。当你试图覆盖一个private方法,编译器并没有报错,但是,实际上你并没有覆盖该方法,只是生成了一个新方法。因为private方法是无法被外部类所访问的,当然就无法覆盖到它了。

使用@Override注解可以防止上述问题。如程序所示:

class finalFunction{

private void finalFunctionA(){

System.out.println("finalFunctionA");

}

private final void finalFunctionB(){

System.out.println("finalFunctionB");

}

final void finalFunctionC(){

System.out.println("finalFunctionC");

}

void functionD(){}

}

class overrideFinalFunction extends finalFunction{

//@Override   添加@Override注解可以识别是否是override

public void finalFunctionA(){

System.out.println("override finalFunctionA");

}

public final void finalFunctionB(){

System.out.println("override finalFunctionB");

}

//final void finalFunctionC(){}   //Cannot override the final method from finalFunction

@Override

void functionD(){} //真正的override方法

}

public class javaFinalFunction extends finalFunction{

public static void main(String args[]){

finalFunction ff = new finalFunction();

//ff.finalFunctionA();  //无法调用private方法

//ff.finalFunctionB();

overrideFinalFunction off = new overrideFinalFunction();

off.finalFunctionA();   //public方法

off.finalFunctionB();

}

}

【final类】

使用final类一般是出于设计原因,不允许该类被继承。这样可以保证类的行为不会改变,或许还能避免一些安全危机。Final类中所有的方法都隐式指定为final方法,因此无法被覆盖(因为final类禁止继承,也就无法覆盖其类中的方法)。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止覆盖length()等方法。

对于final域来说,即使将一个类声明为final,类中的域不会自动成为final域。

final class finalClass{

int testA = 2011;

}

//class extendFinalClassextends finalClass{}  //can not extendthe final class finalClass

public class javaFinalClass{

public static void main(String args[]){

finalClass fc = new finalClass();

System.out.println(fc.testA);

fc.testA = 2012;

System.out.println(fc.testA);

}

}

相关文章:

盛会再临,2018中国大数据技术大会(BDTC)首曝日程及议题

满目皆干货,俯仰尽拾珠。作为年度技术趋势与行业应用的风向标,连续成功举办十一年的中国大数据技术大会(BDTC)携主题“大数据新应用”再度强势来袭,稳踏技术时代浪潮,势将引爆今冬技术圈。 数据&#xff0c…

Linux下修改MAC地址总结

偶尔会用到这个知识点,久了不用又会记不住,所以记之,方便以后查询。 Linux下修改MAC地址 方法一: 1.关闭网卡设备 ifconfig eth0 down 2.修改MAC地址 ifconfig eth0 hw ether MAC地址 3.重启网卡 ifconfig eth0 up 或者将以上内容…

hadoop 2 java hdfs_Hadoop2.6.0学习笔记(二)HDFS访问

鲁春利的工作笔记,谁说程序员不能有文艺范?通过hadoop shell与java api访问hdfs工作笔记之Hadoop2.6集群搭建已经将集群环境搭建好了,下面来进行一些HDFS的操作1、HDFS的shell访问HDFS设计主要用来对海量数据进行处理,即HDFS上存储…

知乎如何洞察你的真实喜好?首页信息流技术揭秘

11月8-9日,由中国 IT 社区 CSDN 与硅谷 AI 社区 AICamp 联合出品的 2018 AI 开发者大会(AI NEXTCon) 在北京举行,就人工智能的最新技术及深度实践,进行了全方位的解读及论证。本文是机器学习技术专题中知乎首页业务总监…

[Web开发] 微软的RSS协议扩展 - FeedSync 介绍 (4)

上一篇文章介绍了在2台电脑上同时修改数据的feedsync 同步过程&#xff0c; 今天再讨论一下当在2台电脑上同时删除同一个数据的情况。 假设最初feed 里面数据是这样的<item><sx:sync id"ep2.100" updates"1" deleted"false" noconflict…

weblogic 修改控制台密码

关掉weblogic所有进程切换到域下面$cd /home/weblogic/Oracle/Middleware/user_projects/domains/jydomain/security$java -classpath /home/weblogic/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.jar weblogic.security.utils.AdminAccount weblogic weblogic123 …

WPF框架的内存泄漏BUG

用户在使用GIX4某模块的过程中&#xff0c;内存只见加不见减。我们怀疑出现了内存泄漏&#xff0c;所以我花了相当一段时间来进行此问题的排查。 我使用Red Gate公司的产品ANTS Memory Profiler 5进行应用程序的内存进行监视。并在过程中修改程序中出现的一些问题。但是最后留下…

java map深拷贝_java 实现Map的深复制

在java中有一个比较有趣的特性&#xff0c;在对对象进行赋值&#xff0c;或者clone时候一般都是我们所说的浅复制&#xff0c;Object A B;也就是说我们获取的并非在堆中重新分配的一块内存&#xff0c;而是一个指向原有数据内存的一个引用。这样的后果就是我们修改了A中的属性…

出门问问工程副总裁黄美玉入选IEEE Fellow,曾担任微软Cortana首席NLP科学家

虽然 IEEE&#xff08;国际电子电气工程协会&#xff09;2019 年的 Fellow 评选结果还未正式出炉&#xff0c;但记者刚刚获悉&#xff0c;IEEE Fellow 又新增一名华人科学家入选——出门问问工程副总裁、Mobvoi AI Lab 的负责人黄美玉博士。黄美玉博士是由于其在语音/语言技术领…

Windows2003服务器不支持FLV视频的解决方法

Windows2003服务器不支持FLV视频的解决方法2007年10月19日 星期五 10:43 A.M.原因&#xff1a;WIN2003加强了IIS6的MIME验证&#xff0c;一切未注册扩展文件格式统统显示404错误。手动在IIS中HTTP头->MIME添加MIME影射关系&#xff0c;MIME类型: video/x-flv 扩展名:.flv&am…

mpi并行 java_【并行计算】用MPI进行分布式内存编程(一)

通过上一篇关于并行计算准备部分的介绍&#xff0c;我们知道MPI(Message-Passing-Interface 消息传递接口)实现并行是进程级别的&#xff0c;通过通信在进程之间进行消息传递。MPI并不是一种新的开发语言&#xff0c;它是一个定义了可以被C、C和Fortran程序调用的函数库。这些函…

JQuery——选择器分类

JQuery选择器1 什么是JQuery选择器快速高效的找到指定节点&#xff0c;支持css语法设置页面2 JQuery选择器分类2.1 基本选择器CSS选择器层级选择器表单域选择器2.2 过滤选择器简单过滤选择器内容过滤选择器属性过滤选择器子元素过滤选择器表单域属性过滤选择器可见性过…

3月6日工作日志-88250

今天&#xff1a; 1. 与zy、vanessa一起使用mingle做了开发计划 2. 使用了XStream重写了XML格式的Dynamic Dictionary Basic Engine TODO&#xff1a; 1. 提高Dynamic Dict引擎的效率 2. 分片转换一部43W词汇的英&#xff0d;中词库(按字母、大小写分片) 转载于:https:/…

专注文本处理,达观数据完成B轮融资,累计融资超2亿元

11月22日&#xff0c;达观数据宣布成功完成1.6亿元B轮融资&#xff0c;由宽带旗下基金晨山资本领投&#xff0c;元禾重元、联想之星、钟鼎资本及老股东等跟投。达观数据总部位于上海张江高科技园区&#xff0c;目前已在北京、成都、深圳、西安等地开设分支机构。2015年获真格基…

Asp.Net Core写个共享磁盘文件Web查看器

查看器功能说明与演示 本查看器主要是为了方便大家查看服务器上的日志&#xff0c;这里没有考虑其他安全性问题&#xff0c;比如特定人员登录才能查看&#xff0c;这个需要您们自己去增加&#xff1b;如果你服务器有对外开放了ip&#xff0c;那么运行这个软件的时候建议考虑配置…

ImageNet时代将终结?何恺明新作:Rethinking ImageNet Pre-training

译者 | 刘畅 林椿眄整理 | Jane出品 | AI科技大本营Google 最新的研究成果 BERT 的热度还没褪去&#xff0c;大家都还在讨论是否 ImageNet 带来的预训练模型之风真的要进入 NLP 领域了。如今&#xff0c;Facebook AI Research 的何恺明、Ross Girshick 及 Piotr Dollar 三位大佬…

java 序列化 缓存_java_缓冲流、转换流、序列化流

一、缓冲流缓冲流的基本原理&#xff0c;是在创建流对象时&#xff0c;会创建一个内置的默认大小的缓冲区数组&#xff0c;通过缓冲区读写&#xff0c;减少系统IO次数&#xff0c;从而提高读写的效率。字节缓冲流构造方法创建字节缓冲输入流&#xff1a;BufferedInputStream bi…

QQ2007去广告教程(本地vip)

只要是vip就可以去掉广告了 关键函数QQHelperDll.dll的IsQQServiceEnable 在入口点修改: mov eax,1 retn 好了这样就成了本地的vip了 因为那个dll的版本太多了不能通用&#xff0c;所以就不提供下载了&#xff08;我的版本7.1.644.1777&#xff09; 同时qq每次升级都有可能替换…

java instanceof 报错_java instanceof方法

基本用法null instanceof Object 为false&#xff1b; null instanceof 任意类 为false&#xff1b;任意实例 instanceof 对应的类或者父类 都为true&#xff1b;基本数据类型 instanceof Object 编译时会报错(如 int a&#xff1b;a instanceof Object 编译不通过)&#xff…

grep的常用命令语法

grep的常用命令语法 1. 双引号引用和单引号引用 在g r e p命令中输入字符串参数时&#xff0c;最好将其用双引号括起来。例如&#xff1a;“m y s t r i n g”。这样做有两个原因&#xff0c;一是以防被误解为 s h e l l命令&#xff0c;二是可以用来查找多个单词组成的字符串&…

千呼万唤始出来!OpenCV 4.0正式发布!

作者 | 周强&#xff08;本文为作者独立观点&#xff0c;转载请联系作者&#xff09;来源 | 我爱计算机视觉OpenCV 4.0 正式版来啦&#xff01;重回英特尔的 OpenCV 终于迎来一次大版本更新&#xff0c;增加了诸多新特性&#xff0c;快来一起看看吧&#xff5e;因为 OpenCV 最开…

ORA-01031: insufficient privileges的解决方法

原文出自:http://www.chinaunix.net/jh/19/132866.html############################################# # # NAME: troubleshoot connect internal.txt # # DESCRIPTION: # connect internal # connect / as sysdba 要口令问题&#xff1a;# refer (METALINK,ORACLEDOC), # me…

java 线程通讯_java多线程(五)线程通讯

1.1. 为什么要线程通信多个线程并发执行时&#xff0c;在默认情况下CPU是随机切换线程的&#xff0c;有时我们希望CPU按我们的规律执行线程&#xff0c;此时就需要线程之间协调通信。1.2. 线程通讯方式线程间通信常用方式如下&#xff1a;l 休眠唤醒方式&#xff1a;Object的w…

合并排序(C语言实现)

递归算法是把一个问题分解成和自身相似的子问题&#xff0c;然后再调用自身把相应的子问题解决掉。这些算法用到了分治思想。其基本模式如下&#xff1a; 分解&#xff1a;把一个问题分解成与原问题相似的子问题 解决&#xff1a;递归的解各个子问题 合并&#xff1a;合并子问题…

工程实践也能拿KDD最佳论文?解读Embeddings at Airbnb

作者 | Mihajlo Grbovic&#xff0c;Airbnb 资深机器学习科学家译者 | Lang Yang&#xff0c;Airbnb 工程经理【导读】本文最早于 2018 年 5 月 13 日发表&#xff0c;主要介绍了机器学习的嵌入技术在 Airbnb 爱彼迎房源搜索排序和实时个性化推荐中的实践。Airbnb 爱彼迎的两位…

计算点、线、面等元素之间的交点、交线、封闭区域面积和闭合集(续1)

继续上一节的内容&#xff0c;本节主要讲解三维空间中射线、线段与平面及三维物体的交点及距离的计算&#xff0c;它们在碰撞检测和可见性剔除等应用中是必不可少的。首先给出3D空间下点乘和叉乘的定义与定理的推导&#xff0c;再谈如何应用到程序编码的工作中。 设三维空间中任…

android 抓取native层奔溃

使用android的breakpad工具 使用这个工具需要下载Breakpad的源码&#xff0c;然后进行编译&#xff0c;编译之后会生成两个工具 我们使用这两个工具来解析奔溃的位置。这里我们可以下载已经编译好的工具 下载地址是&#xff1a;链接&#xff1a;http://pan.baidu.com/s/1jIiU5c…

渗透各行各业,这家RPA外企宣布全面进军中国市场

11月15日&#xff0c;全球机器人流程自动化&#xff08;RPA&#xff09;领域平台UiPath首次在中国举办UiPath Together年度大会&#xff0c;来自自动化、人工智能和机器学习领域的行业专家&#xff0c;以及来自中国和世界的领先公司的客户与合作伙伴共同参与了此次活动。在此次…

java gettext_JAVA中getText()怎么从一个JTextArea中读出内容?

想先创建一个JTextArea&#xff0c;然后在里面输入内容(几个字母)&#xff0c;然后用getText读出里面的内容&#xff0c;可是好像只能是先在JTextArea里面写&#xff0c;然后getText才能读出&#xff0c;而不能先运行&#xff0c;在图形界面的JTex...想先创建一个JTextArea&…

想在SqlDbHelper.cs类中加的垃圾方法

虽然没改写SqlDbHelper.cs类的能力&#xff0c;但好不容易想出来的&#xff0c;放着留个纪念~~~~~/**//// <summary> /// 执行SQL语句&#xff0c;返回第一行&#xff0c;第一列&#xff08;sea&#xff09; /// </summary> /// <param na…