Java内部类

来源:互联网 发布:好学近乎知水印 编辑:程序博客网 时间:2024/05/28 03:03

内部类,顾名思义就是一个类内存在另外一个类,是某个接口的实现,能够完全不可见,并且不可用。所以得到的只是指向基类或接口的引用,所以能够很方便的隐藏实现细节。

优点:(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字段,也不能包含嵌套类,但是嵌套类可以包含所有这些东西。


0 0
原创粉丝点击