关于final大家都知道,网上一搜一大片,大体说的都是final的意思就是保证我们所定义的变量的值不可改变或者引用不可改变~~
总所周知,在java匿名类中我们要去使用外部的局部变量或者参数是,这个被匿名类使用的变量必须是final的,但是大家有没有想过为什么必须是final,总不能说他是final我们就写final好了,这做法白痴都会,接下来我们来讲解下其内部原因。
在介绍之前我们首先要讲解下java中的值传递和引用传递的问题,大家都知道java是值传递,例
public class Test {
public static void main(String[] args) {
String s ="out";
test1(s);
System.out.println(s);
}
public static void test1(String s){
s = "inner";
}
}
打印结果是:"out",这也就是java值传递导致的原因,简单分析下吧,在我们讲s变量传递到test1方法中去的时候,实际上是在栈上copy了一份s的引用,然后操作这个引用,当s重新赋值的时候地址就改变(String是不可变的嘛),完全没有影响到原先s的内容。
介绍了java值传递后,接下来我们来说回归正题,如下面这段代码:
//定义个抽象类
abstract class AbstractClass{
public abstract void m();
}
public static void test(final String s){
AbstractClass c = new AbstractClass(){
public void m(){
s = "inner";
System.out.println(s);
}
};
}
实际上这段代码是被编译成:
public static void test(final String s){
class OuterClass$1 extends AbstractClass{
private final String s;
public OuterClass$1(String s){
this.s = s;
}
public void m(){
s = "inner";
System.out.println(s);
}
};
AbstractClassc = new OuterClass$1(s);
}
可以看到s对象是被传递到了构造函数当中,当我们在使用m来打印出来,但如果java可以让我们以非final类型的参数传递进去的话。由java值传递可知,我们在匿名类中修改该变量的值,那在外部是不可见的。
举个最常见的例子,大家都写过button,我们为他添加匿名类事件监听器,如果我们在内部里面修改了外部变量的引用,那我们在外面是获取不到修改了的值的,这个可以接受?这也就是上面我们所举的值传递的例子。
所以结论出来了,我们在匿名类中需要传递进来final关键字,java希望的是保证内部实现和外在表现的一致性。
ok。。写完了自己的一些看法。一些内容参考部分内容参见http://blog.csdn.net/axman/archive/2006/12/25/1460544.aspx
分享到:
相关推荐
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。 主要介绍:一.final关键字的基本...
在这篇博客中你可以了解到匿名内部类的使用、匿名内部类要注意的事项、如何初始化匿名内部类、匿名内部类使用的形参为何要为final。 一、使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有...
今天小编就为大家分享一篇关于Java为什么匿名内部类参数引用需要用final进行修饰?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
//从阅读角度,这里预期打印a=20,然而只会打印出a=10,会让人误解,因为在Inner的change()中修改的是Inner内部类对象的this.a,它是m
13_Java面向对象_第5天(static、final、匿名对象、内部类、包、修饰符、代码块)_讲义
很好的Java面试题第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
一门专业课要求用python实现k-匿名,在github上找的源码发现都不太符合问题,于是就自己改进了一下,算是个小demo吧,在python2下可以成功跑通,直接运行final.py,数据信息存在.csv
在知乎上看到了一篇帖子 在这个问题下面大家已经吵得不可开交了,看了很多篇文章,被误导进了很多的坑,发现只有下面两篇文章是写的最好的,解释的很清楚,我把两篇文章简单的总结了一下: ...1.问题的引出 ...
主要介绍了Java面向对象编程中final关键字的使用方法详解,包括对内部匿名类无法访问外面的非 final 的变量问题的解读,需要的朋友可以参考下
java易混淆的地方,final, finally, finalize的区别,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类
在外部类内部使用内部类-不要在外部类的静态成员中使用非静态内部类,因为静态成员不能访问非静态成 员。 • 2.在外部类以外使用非静态内部类。 –private 修饰的内部类只能在外部类内部使用。 –在外部...
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。
源代码 public class ThreadDemo { public static void main(String[] args) { ... final int j = i; new Thread(new Runnable() { @Override public void run() { System.out.println(线程 + j);
第一, 谈谈final, finally, finalize的区别。 (最常被问到) final修饰符(关键字) ...第二,Anonymous Inner Class(匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
java内部类,相信很多人都使用过内部类,新建线程使用的匿名内部类,但是有很多人对内部类的一些概念处于模糊阶段,比如为什么方法内部类引用方法参数,方法参数必须设置为final,所以本文系统得整理了一下内部类...
Closure,匿名函数,又称为Anonymous...PHP Closure类之前在PHP预定义接口中介绍过,但它可不是interface哦,它是一个内部的final类。Closure类是用来表示匿名函数的,所有的匿名函数都是Closure类的实例。 $func = fu
Date类 自动拆箱和自动装箱 Arrays 类和接口的关系 内部类 成员内部类 局部内部类 匿名内部类 抽象类 接口 多态 封装 类和对象 方法 StringBuilder类 String类 static for循环 final 权限修饰符 跳转控制语句 while...
作者:guanpj ...在开发过程中,由于习惯的原因...在 Java 8 之前,匿名内部类在使用外部成员的时候,会报错并提示 “Cannot refer to a non-final variable arg inside an inner class defined in a different method”:
匿名内部类的使用(重要!!!!!!!) 13 成员内部类的使用 13 静态内部类的使用 14 枚举的二种实现方式 14 自定义类实现枚举 14 使用 enum 关键字实现枚举注意事项 15 enum 用方法说明 15 enum 实现接口 15 注解的理解 16...
第一章 final关键字1.1 概述1.2 使用方式修饰类修饰方法修饰变量第二章 权限修饰符2.1 概述2.2 不同权限的访问能力第三章 内部类3.1 概述什么是内部类成员内部类访问特点3.2 匿名内部类【重点】前提格式使用方式第四...