1、匿名内部类
将返回值的生成和表示这个返回值的类的定义,放在一起。
例如:匿名类Test
public Test getClass() {
return new Test {
private int i = 10;
public int getValue() { return i; }
};
}
2、内部类链接到外部类
内部类拥有外部类所有成员的访问权。
当外部类的对象创建一个内部类的对象的时候,此内部类对象必定会保存一个指向那个外部类对象的引用。内部类访问外部类的成员就是通过这个隐藏的"引用"来实现的。
内部类对象只有在与其外部类对象相关联的情况下才能被创建。
3、嵌套类(内部类声明为static)
普通的内部类对象保存着外部类对象的引用,而static内部类则不是这样,因此,嵌套类与外部类不需要有联系。
创建嵌套类对象,并不需要外部类的对象(static内部类不需要与外部类有联系)。
不能从嵌套类中访问外部类的非static成员(static内部类没有保存外部对象的引用)。
4、注意
普通内部类的属性和方法,只能放在类的外部层次上,所以普通的内部类不能含有static数据和static方法,也不能包含嵌套类。但是,嵌套类可以包含这些东西。
正常情况下,不能在接口中放置任何方法,但是可以在接口中放置嵌套类。因为嵌套类是static类型的,这样,就只是将嵌套类放置在接口的命名空间中,并不违反接口的规则。
5、内部类的继承
由于内部类的构造器需要用到外部类对象的引用,所以从内部类继承变得有点复杂。所以需要初始化那个"隐藏"的外部类对象。
需要在内部类的构造器中,调用如下 InnerClassXX.super(),来初始化外部类对象。
6、内部类可以被重载吗
一个包含内部类的外部类,在其子类中重写这个内部类,会发生什么呢?答案是,没什么影响。
当继承于外部类时,内部类并没有什么特别的变化,这两个内部类是完全独立的两个实体,各自在自己的命名空间中。
7、局部内部类和匿名类
通常情况下,匿名内部类(简洁,结构不清晰,不易懂)可以表示为另外一种形式,即局部内部类(冗余,结构清晰,易懂)。
通常情况下使用局部内部类,是因为我们需要不止一个此内部类的对象。
8、内部类的好处
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
内部类提供了可以继承多个抽象或者具体类的能力,这样,内部类和接口,完美的解决了多重继承的问题。
对于内部类,且看如下两种情形,很明显对于第二种情形,只有使用内部类才能很好地解决多重继承的问题:
情形一:(一个类实现两个接口)
interface A { }
interface B{ }
class X implements A,B { }
class Y implements A{
B makeB{
return new B() { } ;
}
}
情形二:(一个类继承于两个类)
class D {}
abstract class E {}
class Z extends D{
E makeE(){
return new E() {};
}
}