`
Aga
  • 浏览: 212994 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

为什么匿名内部类只能访问final变量

    博客分类:
  • J2SE
阅读更多
专自:http://lineageii.iteye.com/blog/32404
匿名内部类为什么只能用final.是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。

以下代码为本人所写
package com.cxz.j2se;

public class MyClass {
	public MyClass() {
		final int finalValue = 10;
		int not$Final = 20;
		MyInterface myInterface = new MyInterface() {
			public void functionWithoutPara() {
				//compile Error
				//System.out.println(noFinal); 
				System.out.println(finalValue);
			}

			public void functionWithPara(int num) {
				System.out.println("The parameter " + num
						+ " has been passed by the method");
			}

		};
		myInterface.functionWithoutPara();
		myInterface.functionWithPara(not$Final);
		System.out.println(myInterface.getClass().getName());
	}

	public static void main(String[] args) {
		new MyClass();

	}

}

分享到:
评论
8 楼 liuyuanhui0301 2012-07-19  
  
7 楼 skyuck 2011-01-18  
楼主我也想搞明白,但是你说的我似乎不太理解
6 楼 susaner 2010-10-26  
因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。
这个构成因果关系吗?
5 楼 so-so 2010-10-22  
您的语文果然学得不好!
4 楼 opmic 2010-05-10  


3 楼 wacbysys 2008-08-19  
不过我想说的就是,要是照你说的那样,被定义为final的变量就可以被类里面的其他函数访问了罗,我试了一下,发现不行。看来~~~~
2 楼 wacbysys 2008-08-19  
你的语文学得好差哦,话说成这样!!
不过我还是看懂了,仍然要谢谢你!!!
1 楼 moses3017 2008-05-15  
没看懂,能说得再明白些吗?

相关推荐

    Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释.doc

    Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释.doc

    Java内部类:你真得了解方法内部类吗?

    java内部类,相信很多人都使用过内部类,新建线程使用的匿名内部类,但是有很多人对内部类的一些概念处于模糊阶段,比如为什么方法内部类引用方法参数,方法参数必须设置为final,所以本文系统得整理了一下内部类...

    Static和Final修饰类属性变量及初始化

    1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用.

    【05-面向对象(下)】

    所以静态内部类不能访问外部类的实例成员,只能访问  外部类的类成员。 •静态内部类的对象寄存在外部类里,非静态内部类的对象寄存在外部类实例里 使用内部类 •1.在外部类内部使用内部类-不要...

    Java基础【final、权限、内部类、引用类型】

    第一章 final关键字1.1 概述1.2 使用方式修饰类修饰方法修饰变量第二章 权限修饰符2.1 概述2.2 不同权限的访问能力第三章 内部类3.1 概述什么是内部类成员内部类访问特点3.2 匿名内部类【重点】前提格式使用方式第四...

    JAVA基础知识精华总结 收藏

    (4) 如果声明一个类为final,则所有的方法均为final,无论其是否被final修饰,但数据 成员可为final也可不是。 7、 接口interface (用implements来实现接口) (1) 接口中的所有数据均为 static和final即静态常量...

    21天学通Java-由浅入深

    245 12.3.3 在外部类外访问静态内部类 246 12.4 匿名内部类 247 12.4.1 创建匿名内部类 247 12.4.2 匿名内部类的初始化 249 12.5 综合练习 250 12.6 小结 250 12.7 习题 250 第13章 多线程(精彩视频:55分钟) 252 ...

    day022-jdk8新特性和lambda表达式 代码和笔记.rar

    概念:就是对函数式接口匿名内部类的简写 2. 作用:简化代码 3. 使用: 语法: 函数式接口 变量名 = (参数1,参数2...) -> { //方法体 } (参数1,参数2…)表示参数列表; ->表示连接符;...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    9.1.2 加餐:不可改变的final变量 211 9.1.3 多维数组的长度 212 9.1.4 一维数组的clone()方法 212 9.1.5 当数组类型不再是基本数据类型 214 9.1.6 多维数组的clone()方法 217 9.2 老朋友String类 220 9.2.1 ...

    corejava培训文档

    7.6.1. final变量不能被改变; 7.6.2. final方法不能被改写; 7.6.3. final类不能被继承; 7.6.4. String 类 7.7. 抽象类 7.8. 接口 (模板方法模式) 7.9. Object 类 7.10. 封装类 7.11. 内部类 7.11.1. ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    9.1.2 加餐:不可改变的final变量 211 9.1.3 多维数组的长度 212 9.1.4 一维数组的clone()方法 212 9.1.5 当数组类型不再是基本数据类型 214 9.1.6 多维数组的clone()方法 217 9.2 老朋友String类 220 9.2.1 ...

    java内部学习笔记.docx

    3.16内部类 26 3.17匿名类 27 3.18二维数组和对象数组 28 3.19其他注意事项 28 Java SE核心I 30 4.1 Object类 30 4.2 String类 31 4.3 StringUtils类 33 4.4 StringBuilder类 33 4.5正则表达式 34 4.6 Date类 35 4.7...

    Java 基础核心总结 +经典算法大全.rar

    获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过反射调用方法反射的应用场景 Spring 的 IOC 容器反射 + 抽象工厂模式 JDBC 加载数据库驱动类反射的优势及缺陷 增加程序的...

    JAVA面试题最全集

    被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,...

    Java学习题答案

    14 super()和this()方法只能在构造函数里调用. 15 方法的参数变量不能是final的 16 接口的所有方法默认都是public,abstract和non-static的 17 接口可以声明成final 18 内部类可以访问外层类的任何...

    Java面向对象编程中final关键字的使用方法详解

    主要介绍了Java面向对象编程中final关键字的使用方法详解,包括对内部匿名类无法访问外面的非 final 的变量问题的解读,需要的朋友可以参考下

    疯狂JAVA讲义

    学生提问:为什么静态内部类实例方法也不能访问外部类的实例属性呢? 207 学生提问:接口里是否能定义内部接口? 208 6.7.3 使用内部类 208 学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在...

    java三大特性说明

    属性”的方式访问,方法也为类的所有实例所共有  代码块 : 加载的优先级最高,甚至比主方法的加载还要早.  对于由final static共同修饰的变量,赋值的机会有两个,一是在声明的时候,二是在静态代码块中,两次机会...

Global site tag (gtag.js) - Google Analytics