内部类的一个重要作用是隐藏继承或是对接口的实现,典型的形式是:内部类来继承或是实现接口,由外部类提供代理constructor方法。这些代理constructor方法一般都利用的向上转型,即不返回内部类对象,而是返回内部类继承的父类对象或是实现的接口对象。如:
interface Intf {...}
class Outer
{
class Inner implements Intf {...}
public Intf createInner
{
return new Inner();
}
}
而匿名内部类实际是对上述代码的简化,如:
interface Intf {...}
class Outer
{
public Intf createInner
{
return new Intf() {...};
}
}
这里,两处{...}的内容是一样的。
这里的匿名内部类表示:我要创建一个implements Intf的class,这个class的定义是{...}。由于这个class没有名字,我们用的是new Intf(),可以看作是自动的向上转型。
如果匿名内部类的创建要传参,那么可以直接写在new Intf()的括号里。
如果匿名内部类里要直接使用某个变量或是参数,那么这个变量或是参数必须是final(new Intf()的括号里也需要说明)(Todo:另作一篇详述)。
(4月7日补充:匿名内部类的另一种用法)
interface Intf
{
int sum();
}
public class Outer
{
public static int getSum()
{
return new Intf()
{
public int sum()
{
return 1;
}
}.sum();
}
public static void main(String[] args)
{
System.out.println(getSum());
}
}
因为对匿名内部类的使用是直接new一个匿名内部类对象,所以也可以直接使用这个对象的方法或是域。
(7月27日补充:总结——匿名内部类{}内可写的代码)
interface Intf {...}
class Outer
{
public Intf createInner
{
return new Intf()
{
// Anonymous inner class CANNOT have a named constructor
// only an instance initializer here
{
......
}
// function allowed here
return-type xxx(arg list)
{
......
}
};
}
}
匿名内部类没有构造器,只能有一个initializer (当然,你不用也可以);另外,可以在匿名内部类中写方法。