您的位置:首页 > 其它

匿名内部类为什么要使用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变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: