作者:Flyingis
内部类是Java语言一个重要的基本特性,在Java开发的许多领域都会经常用到。内部类的定义说简单一点就是将一个类定义在另外一个类的内部。内部类允许你把一些逻辑相关的类组织在一起,控制内部类代码的可视性,它和类的组合是完全不同的概念。内部类主要有以下比较关键的特性:<!----><o:p></o:p>
<o:p> </o:p>
1. 普通的非内部类不能被声明为private或protected,否则就失去了创建该类的意义。但是内部类通常可以被声明为private或protected类型,因为这样可以防止他人对该内部类实现的功能进行修改,达到隐藏实现细节的目的。例如:<o:p></o:p>
class Fruit {<o:p></o:p>
private class Weight {<o:p></o:p>
private String i;<o:p></o:p>
private Weight(String j) {<o:p></o:p>
i = j;<o:p></o:p>
}<o:p></o:p>
public String read() {<o:p></o:p>
return i;<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
class test {<o:p></o:p>
public static void main(String[] args) {<o:p></o:p>
Fruit f = new Fruit();<o:p></o:p>
f.Weight w = f.new Weight(); //不能访问private类,如果Weight为protected类型则可以<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
2. 在方法或某控制语句(if/for/while等)的作用域内定义内部类,将只能在该范围内调用内部类的方法和成员变量。<o:p></o:p>
3. 匿名内部类是一种特殊的内部类,如果希望它使用一个在其外部定义的对象,那么编译器会要求其参数引用是final的。<o:p></o:p>
public class Fruit {<o:p></o:p>
public Tea cont(final int j) {<o:p></o:p>
return new Tea() {<o:p></o:p>
private int i = j;<o:p></o:p>
public int read() {<o:p></o:p>
return i;<o:p></o:p>
}<o:p></o:p>
}; //注意这里的分号<o:p></o:p>
}<o:p></o:p>
public static void main(String[] args) {<o:p></o:p>
Fruit f = new Fruit();<o:p></o:p>
Tea t = f.cont;<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
而当方法cont(final int j)中的参数j只是被传递到匿名类中的构造器时,可以不用被声明为final类型,如return new Tea(j)。这里提到了匿名内部类的构造器,那么它是怎么被初始化的呢?<o:p></o:p>
public class Fruit {<o:p></o:p>
public Tea cont(int j) {<o:p></o:p>
return new Tea(j) {<o:p></o:p>
System.out.println(j);<o:p></o:p>
}; <o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
还可以这样初始化匿名内部类:<o:p></o:p>
public class Fruit {<o:p></o:p>
public Tea cont(final int j) {<o:p></o:p>
return new Tea(j) {<o:p></o:p>
int i;<o:p></o:p>
// 初始化匿名内部类<o:p></o:p>
{<o:p></o:p>
i = j;<o:p></o:p>
System.out.print(i);<o:p></o:p>
}<o:p></o:p>
}; <o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
方法 cont() 可以被称为实例初始化方法,使得匿名内部类通过构造器而被初始化,在实际应用中,我们不能重载实例初始化方法,因为匿名内部类只能有一个构造方法。