可以将一个类的定义放在另一个类的定义内部,这就是内部类。内部类是一钟非常有用的特性,因为它允许程序员把一些逻辑相关的类组织在一起,并控制内部类的可视性。
在最初,内部类看起来就像是一种内部隐藏机制:将类置于其他类的内部。但是,内部类远不止如此,它了解外围类,并能与之通信,而且你用内部类写出的代码优雅而清晰。
内部类的代码操作创建它的外围类的对象,所以可以认为内部类提供了某种进入外围类的窗口。一般来说,内部类继承某个类或者实现某个接口。每个内部类都能独立地继承一个接口的实现,所以无论外围类是否已经继承了某个接口的实现,对于内部类都是没有影响的。
考虑这样一种情形:必须在一个类中以某种方式实现两个接口。由于接口的灵活性,你有两种选择:使用单一类,或者实现内部类。
两个接口为:
interface A{}
interface B{}
我们可以选择单一类:
class X implements A, B{}
或者内部类:
class Y implements A{
B makeB(){
return new B() {};
}
}
然而,如果拥有的是抽象类或者是具体的类,而不是接口呢?我们知道,类只能继承一个类,这个时候就只能使用内部类才能实现多重继承了。
class A {}
abstract B {}
class C extends A{
B makeB() {
return new B() { };
}
}
public class E{
static void takesA( A a){ }
static void takesB(B b){ }
public static void main(String [] args ){
C c = new C();
takesA(c);
takesB(c,makeB);
}
}
也就是说,内部类实现了“多重继承”,内部类允许继承多个非接口类型(类或者抽象类)。