Java内部类|静态内部类

Java是一门纯粹的面向对象编程语言,一般而言,一个类型就是一个java文件,如果将一个类型定义到另一个类型里面,那么两个类型就只有一个Java文件(仅限源代码,编译过后还是一个类型对应一个class文件)。使用内部类的很大一部分原因就是为了满足面向对象编程+封装思想,有时一个类型中还可以更细粒度的进行封装,这时如果我们将整个能力封装为一个独立的类型,是有过度封装的嫌疑的,那么将这个能力以类型的方式封装得到另一个类型中,就完美的中和了这种矛盾。另外,内部类可以继承另外一个类,这样就一定程度上弥补了Java无法多继承的遗憾。还有,内部类在回调函数的编写上也提供了极大的方便。下面我们来讲讲内部类的特性。

根据使用内部类方式,我们将内部类划分为四种,

1、静态内部类

2、非静态内部类

3、局部内部类

4、匿名内部类

内部类具备的通用特性是外部类无法访问内部类,内部类却能访问外部类(甚至私有数据)。我们来说说这里几种内部类的用途。

静态内部类:

静态内部类的使用不依赖外部类,也就是说你可以直接通过外部类型引用内部类型,如new OuterClass.InnerClass(),同时静态内部类由于是静态,所以无法访问外部类非静态数据,这是静态属性决定的。静态内部类多用于同一个功能的封装需要多个类型来支持,而内部类功能相对单一,所以将其放到外部类中,达到封装和简洁的目的。另外ThreadLocal中就有静态内部类ThreadLocalMap,可以看看官方的使用方式。

非静态内部类:

可以和静态内部类对比,非静态内部类独立使用方式是new OuterClass().new InnerClass(),在这里,内部类可以访问外部类数据(包括私有),但是外部类无法访问内部类数据。使用的场景一般是只对外部类使用,一般不对外暴露使用。

局部内部类:

局部内部类使用很少,分为两种情况,一种是静态方法中局部类,这时的局部类可以访问外部类的静态数据,如果在非静态方法中,则可以访问外部类的所有数据,包括私有,局部内部类可以访问方法局部变量,但是必须是final修饰的局部变量。

匿名内部类:

这个使用多,匿名说的是隐匿了类型的名字,所以一般需要一个接口或者超类来表示类型,下面就是实例化Runnable接口的子类是就隐匿了子类的名字,使代码变得简单优雅,匿名内部类的使用往往也是为了简化代码。

new Thread( new Runnable() {
    @Override
    public void run() {
        // TODO Auto-generated method stub
    }
}).start();

知道了为什么需要内部类,你就很自然的知道那些时候需要使用内部类了。

猜你喜欢

转载自blog.csdn.net/tales522/article/details/81486380