内部类

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() {};

            }

        }

你可能感兴趣的:(JAVA编程思想)