谈谈final的作用
前言
一直想写写这个话题。代表公司也面试过一些求职者,每次面试我必问的两个问题之一就是“请你谈一谈对于final关键字的理解”。这是一个简单的小问题,但是不要小看它,通过对这个问题的回答以及一些简单的扩展就能看出一个求职者的基础是否扎实以及是否有钻研精神。OK,开始进入主题。
final关键字的作用
相信对于final的用法,大多数人都可以随口说出三句话:
1、被final修饰的类不可以被继承
2、被final修饰的方法不可以被重写
3、被final修饰的变量不可以被改变
重点就是第三句。被final修饰的变量不可以被改变,什么不可以被改变呢,是变量的引用?还是变量里面的内容?还是两者都不可以被改变?写个例子看一下就知道了:
public class FinalString
{
private String str; public FinalString(String str)
{
this.str = str;
} public String getStr()
{
return str;
} public void setStr(String str)
{
this.str = str;
}
}
public class Test
{
public static void main(String[] args)
{
final FinalString fs = new FinalString("1");
fs.setStr("2");
System.out.println(fs.getStr());
}
}
运行一下,一点问题都没有。稍微修改一下呢:
public static void main(String[] args)
{
final FinalString fs = new FinalString("1");
final FinalString fss = new FinalString("333");
fs = fss;
}
第5行报错了,“The final local variable fs cannot be assigned”。可见,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的。OK,那final修饰数组呢?
public static void main(String[] args)
{
final String[] strs0 = {"123","234"};
final String[] strs1 = {"345","456"};
strs1 = strs0;
strs1[1] = "333";
}
同样,第5行报错了“The final local variable strs1 cannot be assigned”,第6行一点问题都没有。变量和数组一样,都是引用不可变,引用指向的内容可变。实际上如果用过FindBugs插件的应该知道,假如代码里面用final修饰了一个数组,那么改行代码会被作为findBugs的一个bug被查找出来,因为“用final修饰数组是没有意义的”。
接下来,再看一下用final修饰方法参数的场景:
public class Test
{
public static void main(String[] args)
{
FinalString fs = new FinalString("");
A(fs);
} private static void A(final FinalString fs)
{
fs.setStr("123");
FinalString fss = new FinalString("22");
fs = fss;
}
}
一样,同样是13行报错,11行没有问题,相信大家已经知道原因了。
总结
“引用”是Java中非常重要的一个概念,对于引用的理解不深,很容易犯一些自己都没有意识到的错误。被final修饰的变量,不管变量是在是哪种变量,切记不可变的是变量的引用而非引用指向对象的内容。另外,本文中关于final的作用还有两点没有讲到:
1、被final修饰的方法,JVM会尝试为之寻求内联,这对于提升Java的效率是非常重要的。因此,假如能确定方法不会被继承,那么尽量将方法定义为final的,具体参见运行期优化技术的方法内联部分
2、被final修饰的常量,在编译阶段会存入调用类的常量池中,具体参见类加载机制最后部分和Java内存区域
谈谈final的作用的更多相关文章
- 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因
声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...
- 谈谈 final finally finalize 区别
声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ...
- final的作用
前言 一直想写写这个话题.代表公司也面试过一些求职者,每次面试我必问的两个问题之一 就是“请你谈一谈对于final关键字的理解”.这是一个简单的小问题,但是不要小看它,通过对这个问题的回答以及一些简单 ...
- java面试题(杨晓峰)---第三讲谈谈final、finally、finalize有什么不同?
java语言有很多看起来相似,但用途却完全不相同的语言要素,这些内容往往容易成为面试官考察你知识掌握程度的切入点. 今天我要问你一个基础的java经典题目,谈谈final.finally.finali ...
- Java核心-03 谈谈final、finally、 finalize有什么不同?
今天,我要问你的是一个经典的 Java 基础题目,谈谈 final.finally. finalize 有什么不同? 典型回答 final 可以用来修饰类.方法.变量,分别有不同地意义,final修饰 ...
- Java中final的作用
Java中Final可以被用于变量,方法,类.具体来说: 1, Final 变量 修饰主类型时,制定变量为常数,不希望被改变 修饰类类型时,表示变量的句柄不变,不能被指定指向新的变量 修饰参数时,参数 ...
- 谈谈final、finally、finalize的区别
1.final:如果一个类被final修饰,意味着该类不能派生出新的子类,不能作为父类被继承.因此一个类不能被声明为abstract,又被声明为final.将变量或方法声明为final.可以保证他们在 ...
- 46.谈谈SDRAM的作用
SDRAM这个至今还在用的存储器,虽然被后来的DDR取代,掌握好它还是很重要的.之前在调试时,确实费了好大劲,它的复杂性毋庸置疑,一般人要想弄懂他,得花1个月左右吧,至少我这么认为.话说回来,SDRA ...
- 谈谈final、finally和finalize
final: final为修饰符, 如果类被声明为final,则不能派生新子类. 如果变量被声明为final,则必须在声明时初始化,在以后的引用只能读取,不可修改. 如果方法被final声明,则只能使 ...
随机推荐
- vpython初探
vpython 是python默认的3D模块,和python有一样的风格.与PyOpenGL相比,容易上手. vpython下载:vpython的官网(www.vpython.org).顺便说一句,官 ...
- oracle 存储过程 包 【转】
一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...
- CSS布局技巧 -- 各种居中
多行垂直居中 废话少说,直接上例子!!! display:table Html代码: <div class="wrapper"> <div class=" ...
- Ajax Step By Step4
第四,[$.ajax()] $.ajax()是所有 ajax 方法中最底层的方法,所有其他方法都是基于$.ajax()方法的封装.这个方法只有一个参数,传递一个各个功能键值对的对象. $.ajax() ...
- 1306. Sorting Algorithm 2016 12 30
1306. Sorting Algorithm Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description One of the f ...
- PD4F将HTML转换为PDF乱码问题
修改pd4fonts.properties文件如下: KaiTi_GB2312=SIMKAI.TTFSimSun=SIMKAI.TTF
- HTML流动布局各种宽度自适应
<!DOCTYPE html> <html lang="en"> <style> html,body{ padding: 0;margin: 0 ...
- noip2012-day2-t2
[问题描述] 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们 ...
- ArcGIS10.1 api for Flex开发用于ArcGIS 9.3时QueryTask 'Error #2032'错误的解决方案
因客户GIS软件需求,将应用降级到低版本ArcGIS9.3,不仅数据有些样式.配色.字符有些问题,API也要相应“降级”,解决如下: 利用9.3+flex做QueryTask时候出现了[RPC Fau ...
- 注意ArrayAdapter的Add()方法
ArrayAdapter类可以作为ListView等的适配器资源,并且可以动态向适配器中添加新的数据,这就是ArrayAdapter.Add()方法的作用.但是在使用该方法时如果出错,那就需要检查Ar ...