内部类,顾名思义就是一个类内存在另外一个类,是某个接口的实现,能够完全不可见,并且不可用。所以得到的只是指向基类或接口的引用,所以能够很方便的隐藏实现细节。
优点:(1)在于可以方便的访问外部类中的私有成员,若在外部类直接使用内类实例化对象,如下:
外部类.内部类 内部类对象=外部类实例.new 内部类实例();
(2)如果一个内部类使用static关键字声明,则此内部类就将成为外部类,可以直接通过外部类.内部类的形式访问;
(3)内部类可以在任意地方使用,可以在方法中声明。注意,在方法中声明的内部类可以直接访问外部类中的各个成员,但是如果想要访问方法中的参数,则要在参数上使用final关键字。
(4)另外,内部类还可以实现链表。可以自己试一下...
(5)每个内部类都能独立的继承自一个接口的实现,所以无论外部类是否已经继承了某个接口的实现,对于内部类没有影响
(6)如果拥有的是抽象类或具体的类,而不是接口,那就只能使用内部类才能实现多重继承了。
(7)内部类可以有多个实例,每个实习都有自己的状态信息,并且与外围类的信息相互独立。在单个的外围类中,可以让多个内部类以不同的方式实现同一接口,或继承同一类。创建内部类对象的时刻并不依赖于外围类对象的创建,内部类并没有令人迷惑的"is--a"关系;它就是一个独立的实体。
(8)闭包是一个可调用的对象,他记录了一些信息,这些信息来自于创建他的作用域。内部类是面向对象的闭包,因为他不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向外围对象的引用,在此作用域内,内部类操作所有成员,包括private成员。
接下来讲一下匿名内部类:
作用:(1)一个类用于继承其他类或者实现接口,并不需要增加额外的方法,只是对继承方法的实现或覆盖。
(2)只是为了获得一个对象实例,不需要知道其实际类型。
(3)类名没有意义,不需要用到。
匿名内部类的实现,如下:
public class Parcel{
public Contents contents(){
return new Contents(){
private int i=11;
public int value(){
return i;
}
};
}
public static void main(String args[])
{
Parcel p=new Parcel();
Contents c=p.contents();//创建一个继承自Contents的匿名类的对象
}
}
上述类是下述形式的转化:
public class Parcel{
class MyContents implements Contents{
private int i=11;
public int value(){
return i;
}
}
public Contents contents(){
return new MyContents;
}
public static void main(String args){
Parcel p=new Parcel();
Contents c=p.contents();
}
}
下面讲一下嵌套类:如果不需要内部类对象与外围类对象之间有联系,那么就可以将内部类声明为static.
(1)要创建嵌套类对象,并不需要其外围类对象。
(2)不能从嵌套类的对象中方为非静态的外围类对象。
(3)普通内部类的字段和方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类,但是嵌套类可以包含所有这些东西。