文档章节

Java 基础 -2 关于final

wow863597
 wow863597
发布于 2016/05/07 18:27
字数 397
阅读 6
收藏 1

final : 修饰 变量 变量被赋初值之后不能改变 ;  修饰 方法方法不能重写 ,修饰类 不能派生子类 

final 修饰的变量实现了宏替换 , 即在编译期间就把变量替换为值 的形式。 主要的好处是在编程过程中防止向前引用实例变量 的时候实例变量虽然初始化但是还未被赋值 。

如果程序需要在局部内部类(匿名内部类)中使用局部变量那么这个局部变量必须要使用final修饰。关于这一句话原因 特别查了一下 书 《疯狂JAVA-突破程序员基本功的16课 》。解释如下: 

对于普通局部变量而言,作用范围在方法内,随着方法结束而消亡,假如在内部类中使用该局部变量,有可能造成隐式“闭包”,即局部变量脱离他所在方法继续存在。

public class ThreadDemo{
public static void main (String [] args ){
//局部變量 str 
 final String str ="hello ,MR.";
 new Thread (new Runnable(){
 public void run (){
 for(int i=0;i<100;i++){
 //使用局部变量
 System.out.println(str+i);
 try{
 Thread.sleep(1000);
 }catch(Exception e ){
 e.printStackTrace();
 }
 //若不适用fianl可能出现混乱的语句 
 // str ="JAVA";
 }
 }).start(); //标记①
 }
 }

程序运行到标记①的位置 的时候 main方法结束 ,局部变量str 到此消亡 但是 线程 并未结束 ,str出现隐式“闭包”。若不适用final 修饰 ,则有可能出现  mian方法结束 之后 str的值被修改 。引起混乱。


© 著作权归作者所有

共有 人打赏支持
wow863597
粉丝 3
博文 38
码字总数 23132
作品 0
济南
程序员
私信 提问
为什么interface的变量必须是public final static的

public 感觉是因为Java对接口的要求是所有类都可以实现接口,不能对接口进行包什么的限制,所以只能是public了 static 因为接口不能实例化,所以只能是静态的 final 为什么接口成员应该是常量...

swearyd457
2013/10/10
0
0
03《Java核心技术》之谈谈final、finally、 finalize有什么不同?

一、提出问题 Java 语言有很多看起来很相似,但是用途却完全不同的语言要素,这些内容往往容易成为面试官考察你知识掌握程度的切入点。 今天,我要问你的是一个经典的 Java 基础题目,谈谈 ...

飞鱼说编程
09/14
0
0
java程序员基础进阶篇,万丈高楼平地起

一.final,finally,finalize 三者区别 Final是一个修饰符: 当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值 当final修饰的变量为静态变量(即由static修饰)时,必须在声明这...

启示录是真的
05/26
0
0
【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___
05/06
0
0
简单的入门Android开发和Java语言基础[图]

简单的入门Android开发和Java语言基础[图] 前言: 去年年底到今年年初,我做过简单的智能家居,也实现过一些简单的直连和远程的智能家居。于是就将最简单的通信发布出来:智能家居简单实现—...

原创小博客
08/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

telegram_bot

new group -> 选择人 -> 填写群名 搜索BotFather -> start =========================== ou can control me by sending these commands: /newbot - create a new bot /mybots - edit your bo......

八戒八戒八戒
15分钟前
1
0
Spring boot中使用Jackson ObjectMapper注入

问题 本身spring boot已经集成了Jackson的库,我想自己在Controller中直接使用Spring默认的ObjectMapper,应该怎么做? RestController.java public class RestController { private fi...

亚林瓜子
20分钟前
3
0
老男孩 - python函数编程day2

mark

以谁为师
35分钟前
1
0
【58沈剑 架构师之路】缓存,究竟是淘汰,还是修改?

允许cache miss的场景,不管是memcache还是redis,当被缓存的内容变化时,是修改缓存,还是淘汰缓存?这是今天将要讨论的话题。 问:KV缓存都缓存了一些什么数据? 答: (1)朴素类型的数据...

张锦飞
37分钟前
1
0
Spring异常之Druid – unregister mbean error set JAVA_OPTS="-Ddruid.registerToSysProperty=true"

Spring异常之Druid – unregister mbean error 2017年04月19日 12:13:42 Dr.Zhu 阅读数:6688 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zt_fucker/arti...

linjin200
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部