匿名内部类为什么要使用final类型变量
2013-12-12 20:24
316 查看
(1).java的一些基础
在class内部,我们可以包含变量、块、方法、构造器以及类:
(1)变量
静态变量(成员变量):定义在类中,方法外;加static修饰
实例变量(成员变量):定义在类中,方法外
普通变量(局部变量):定义在方法内
(2)块
静态初始化块:定义在类中,方法外;加static修饰
实例初始化块:定义在类中,方法外
普通代码块:定义在方法内
(3)方法(调用才能使用)
静态方法:加static修饰。
实例方法:
(4)构造器
程序执行的过程:
静态变量-静态初始化块-(主入口函数)-实例变量-实例初始化块-构造器
总结:
1.一个对象第一次被创建时,先要加载该对象所属的类,即对应的.class文件,当然如果类已经加载,再次创建该类的对象时,就不再需要重新加载类了。 而一个类加载的时候,有三个部分需要加载:
a:一个是静态变量,b:然后是静态初始化块。
2.然后开始创建该类的实例了,当然如果静态方法跟静态初始化对象中有对象的创建时,就继续加载该对象的类,当然已经加载了该对象的类的话就不需要再次加载了。那么对象实例的创建过程是什么呢?
a:首先是成员变量的引入, b:然后是实例初始化块, c:之后才是构造方法, 构造方法执行完成之后才算把这个对象给创建出来了。
例子:
class Parent {
public static String p_StaticField = "父类--静态变量";
public String p_Field = "父类--变量";
// 下面这些是干什么的?解释以下,不是很明白
static {
System.out.println(p_StaticField);
System.out.println("父类--静态初始化块");
}
// 下面这是干什么的?不明白?为什么这么写
{
System.out.println(p_Field);
System.out.println("父类--初始化块");
}
public Parent() {
System.out.println("父类--构造器");
}
}
public class test extends Parent {
public static String s_StaticField = "子类--静态变量";
public String s_Field = "子类--变量";
// 静态初始化块
static {
System.out.println(s_StaticField);
System.out.println("子类--静态初始化块");
}
{
System.out.println(s_Field);
System.out.println("子类--初始化块");
}
public test() {
System.out.println("子类--构造器");
}
public static void main(String[] args) {
System.out.println("-------------------");
new Parent();
System.out.println("-------------------");
new test();
System.out.println("-------------------");
new test();
{
}
}
}
程序的运行结果为:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
-------------------
父类--变量
父类--初始化块
父类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
来自 <http://bbs.csdn.net/topics/310164953>
(5)类
静态嵌套类:成员类;static。
从技术上说不是内部类,不能访问实例数据;如果与外嵌类关联大可以声明它,否则声明一个public class不是更好。(需要new才能获得实例)
内部类:内部类有三种形式:成员类、本地类和匿名类,每个类依次都是对它前一个类的改进。内部类的可视范围是它的直接外嵌类(这一点和嵌套静态类不同,嵌套类在其外嵌类之外也是可视的),也就是说内部类可以直接引用外嵌类中的任何成员。因为内部类与外嵌类的实例相关,所以内部类拥有两个 this 指针,一个指向内部类的实例本身,一个指向外嵌类实例。内部类的一个主要用途是用于 GUI 的事件处理程序。
成员类:成员类
成员类很像嵌套静态类,只是不带 static 关键字。
本地类:代码块中声明;只能访问final变量或参数
一般来说,本地类在方法中进行声明。成员类和本地类的差别很小,通过把本地类移到方法的外部,我们可以很容易得把它转换成为成员类。它们两个之间最重要的差别是,本地类只能访问 final 的变量或者参数。
匿名类:直接实例化对象
允许我们把类的定义和实例的分配组合在一起。无须象其它任何嵌套类那样进行声明,我们可以直接用 new SomeClass() 实例化对象,并且在实例化的位置把整个类的实现都放在花括号中。
来自 <http://hi.baidu.com/cgjhappy/item/c5b7362e1787fe886f2cc34f>
(2)为什么匿名内部类只能访问final类型的变量?
首先匿名内部类它演变自成员类,本地类。成员类引用成员变量没有问题;而本地类由于存在于代码块或方法中,代码块与方法里存在局部变量,局部变量是不可靠的,有可能是其他方法中的,有可能是没有初始化的,所以本地类不允许局部变量的引入,只能引入静态变量或实例变量。到了匿名内部类,它的情况与本地类就类似了!而它的特点就是可以直接实例化,省的声明完了还得new一次。
所以匿名内部类只能访问实例变量、静态变量或者final变量
在class内部,我们可以包含变量、块、方法、构造器以及类:
(1)变量
静态变量(成员变量):定义在类中,方法外;加static修饰
实例变量(成员变量):定义在类中,方法外
普通变量(局部变量):定义在方法内
(2)块
静态初始化块:定义在类中,方法外;加static修饰
实例初始化块:定义在类中,方法外
普通代码块:定义在方法内
(3)方法(调用才能使用)
静态方法:加static修饰。
实例方法:
(4)构造器
程序执行的过程:
静态变量-静态初始化块-(主入口函数)-实例变量-实例初始化块-构造器
总结:
1.一个对象第一次被创建时,先要加载该对象所属的类,即对应的.class文件,当然如果类已经加载,再次创建该类的对象时,就不再需要重新加载类了。 而一个类加载的时候,有三个部分需要加载:
a:一个是静态变量,b:然后是静态初始化块。
2.然后开始创建该类的实例了,当然如果静态方法跟静态初始化对象中有对象的创建时,就继续加载该对象的类,当然已经加载了该对象的类的话就不需要再次加载了。那么对象实例的创建过程是什么呢?
a:首先是成员变量的引入, b:然后是实例初始化块, c:之后才是构造方法, 构造方法执行完成之后才算把这个对象给创建出来了。
例子:
class Parent {
public static String p_StaticField = "父类--静态变量";
public String p_Field = "父类--变量";
// 下面这些是干什么的?解释以下,不是很明白
static {
System.out.println(p_StaticField);
System.out.println("父类--静态初始化块");
}
// 下面这是干什么的?不明白?为什么这么写
{
System.out.println(p_Field);
System.out.println("父类--初始化块");
}
public Parent() {
System.out.println("父类--构造器");
}
}
public class test extends Parent {
public static String s_StaticField = "子类--静态变量";
public String s_Field = "子类--变量";
// 静态初始化块
static {
System.out.println(s_StaticField);
System.out.println("子类--静态初始化块");
}
{
System.out.println(s_Field);
System.out.println("子类--初始化块");
}
public test() {
System.out.println("子类--构造器");
}
public static void main(String[] args) {
System.out.println("-------------------");
new Parent();
System.out.println("-------------------");
new test();
System.out.println("-------------------");
new test();
{
}
}
}
程序的运行结果为:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
-------------------
父类--变量
父类--初始化块
父类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
来自 <http://bbs.csdn.net/topics/310164953>
(5)类
静态嵌套类:成员类;static。
从技术上说不是内部类,不能访问实例数据;如果与外嵌类关联大可以声明它,否则声明一个public class不是更好。(需要new才能获得实例)
内部类:内部类有三种形式:成员类、本地类和匿名类,每个类依次都是对它前一个类的改进。内部类的可视范围是它的直接外嵌类(这一点和嵌套静态类不同,嵌套类在其外嵌类之外也是可视的),也就是说内部类可以直接引用外嵌类中的任何成员。因为内部类与外嵌类的实例相关,所以内部类拥有两个 this 指针,一个指向内部类的实例本身,一个指向外嵌类实例。内部类的一个主要用途是用于 GUI 的事件处理程序。
成员类:成员类
成员类很像嵌套静态类,只是不带 static 关键字。
本地类:代码块中声明;只能访问final变量或参数
一般来说,本地类在方法中进行声明。成员类和本地类的差别很小,通过把本地类移到方法的外部,我们可以很容易得把它转换成为成员类。它们两个之间最重要的差别是,本地类只能访问 final 的变量或者参数。
匿名类:直接实例化对象
允许我们把类的定义和实例的分配组合在一起。无须象其它任何嵌套类那样进行声明,我们可以直接用 new SomeClass() 实例化对象,并且在实例化的位置把整个类的实现都放在花括号中。
来自 <http://hi.baidu.com/cgjhappy/item/c5b7362e1787fe886f2cc34f>
(2)为什么匿名内部类只能访问final类型的变量?
首先匿名内部类它演变自成员类,本地类。成员类引用成员变量没有问题;而本地类由于存在于代码块或方法中,代码块与方法里存在局部变量,局部变量是不可靠的,有可能是其他方法中的,有可能是没有初始化的,所以本地类不允许局部变量的引入,只能引入静态变量或实例变量。到了匿名内部类,它的情况与本地类就类似了!而它的特点就是可以直接实例化,省的声明完了还得new一次。
所以匿名内部类只能访问实例变量、静态变量或者final变量
相关文章推荐
- 05 添加信息
- linux 卸载软件
- IOS开发之UIScrollView与UIPageControl的用法
- MySQL 数据库远程访问授权
- 【Cocos2d-x游戏引擎开发笔记】CCHttpRequest联网
- MySQL基准测试工具
- 模块编译常见错误汇总
- 让我们一起来看看计算的本质吧!
- 面积
- 壳编写
- JavaFx2学习笔记day01
- robotium 测试android渠道包,采用批处理+robotium脚本的方式
- 04 用户名和密码验证是否正确
- 条件语句 if
- xml schema----java Web
- Conversion to Dalvik format failed: Unable to execute dex
- Web Services--gSOAP 2.7.6 第七章(7.1.5)
- 什么是奢侈品?
- 在Struts2的Action中获得request response session几种方法
- outlook中打不开超链接