java基础复习之内部类

  java中内部类存在于java类或者类的某个方法中。

  对于内部类的作用,在《THINK IN JAVA》一书中说道:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响.

对于这句话个人理解是:普通的java类只能继承一个父类,一定意义上来说这限制了java类的功能扩展,即我定义了一个java bean  A,定义这个bean的目的肯定是要通过他来实现一些功能,所以对于这个bean来说我又自定义了它特有一些属性和功能,但是在实际使用中,由于需求的变更,或者新的新增需求,我发现这个bean的所提供的行为达不到我实际的要求,所以我要在它的基础上添加一些新的功能,但是为了提高代码的重用性,我选择新建一个B类来继承A,这样B便拥有了A的行为以及特征,问题考虑到此都可以很完美的解决,我既提高了代码的重用性,又给它添加了新的功能,只要在用到A的对象的时候,将它的实例选择用B来赋值便可以了(JAVA的多态),我可以同时拥有A的行为特征,又可以调用B所重写的A的行为。也就是我根据需求所修改的新的方法实现。(这里需要注意,java多态性的定义是如果父类的引用是子类的实例,并且子类覆写了父类的某个方法,那么在调用被覆写的方法时,便会调用子类中的方法。)

  但是,基于此问题,我们可以延伸一下,如果B类这个时候又需要拥有C类的行为以及特征呢?就比方说:我需要生产一个毛绒玩具,A类可以生产它的皮毛,眼睛以及装饰物,但是无法生产内在的填充物,我如果想成功的生产出一个毛绒玩具,那么势必需要生产填充物的技术,但是如果新掌握一门技术对我来说需要耗时耗力,而且所带来的收益与我付出的时间和精力不成正比,所以我选择和一家我信得过的商家一起来做,他提供生产填充物的技术,而我提供外面装饰的技术,这时我便需要一台生产机器既有我的技术,又有合作商家的技术。通过这台机器我便可以达到我的要求成功生产出毛绒玩具。但是在具体的代码中要如何实现呢,根据java的规范定义,每个类只能继承一个父类,按此要求的话我这台机器便只能拥有我的技术而无法同时拥有两家的技术,所以我需要对这台机器进行更新换代,丰富它的内核,在给它加一个处理器,一个处理器用我的技术bean A ,另一个用合作商家的技术bean C。这样我的问题就迎刃而解了。接下来我们在把问题缩小化,前面说过,这台机器是我的,它已经有了bean A的功能,我只需要在给它加上bean C的功能就可以了。

  考虑到此,就很简单了,我只需要在B中声明一个内部类D,让它来继承C,这个内部类就相当于我在机器上新加的处理器,它是我机器的一部分所以我允许它访问我的技术,也就是说,D可以无限制、无约束的访问B的任何成员变量以及方法包括private声明的变量和方法。

  至此,我的问题得到了解决,在生产的时候,我只需要在B类中生产的方法体里面拿到D的实例,然后用D去生产填充物。最后将填充物与装饰物一起加工便可以生产一个毛绒玩具,下面贴上代码:   

  至此,已经简单的介绍了一下内部类的一个简单的作用,我们再继续往下扩展这个问题,此时有另外一个厂家生产其它的毛绒玩具,也需要生产填充物,它跟我们的情况一样,幸运的是我们手上有可以信得过的商家来与我们合作生产,但是它并没有,所以他找到了我,想借我的机器过去生产填充物,我当然不会傻乎乎的把技术给他,所以我提出了一个条件,我可以帮你生产填充物,但是只能用我的机器来生产,这样一来,我既帮了别人,又保护了我的技术产权。对于java来说当然也会考虑到这一点,所以对于外部想拿到内部类实例的情况便有了定义:必须通过外围类的实例来生成内部类的实例。                              

   当然 对于这一点的定义的原因,肯定也不会这么简单;但是也没有深究下去的必要。此外,前文说到内部类可以无限制的方位外围类的成员变量以及行为方法,虽然在此例子中没有体现出来,但是有一点需要注意,如果内部类有同名方法必须使用"OuterClass.this.MethodName()"格式调用(其中OuterClass与MethodName换成实际外部类名及其方法;this为关键字,表示对外部类的引用);若内部类无同名方法可以直接调用外部类的方法。
        但外围类无法直接调用内部类的private方法,外部类同样无法直接调用其它类的private方法。注意:内部类直接使用外部类的方法与该方法的权限与是否static无关,它取决于内部类是否有同名方法。

 其实使用内部类最大的优点就在于它能够非常好的解决多重继承的问题,但是如果我们不需要解决多重继承问题,那么我们自然可以使用其他的编码方式,但是使用内部类还能够为我们带来如下特性(摘自《Think in java》):

      1、内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。

      2、在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。

      3、创建内部类对象的时刻并不依赖于外围类对象的创建。

      4、内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。

      5、内部类提供了更好的封装,除了该外围类,其他类都不能访问。

猜你喜欢

转载自www.cnblogs.com/todayIsLuckyDay/p/8945618.html