首页 > 代码库 > 内部类

内部类

前言

  内部类是定义在一个类里面的类,灵活地使用它能让代码变得更优雅。

  本文讲解内部类的机制以及使用技巧。

性质

  首先要强调的是:内部类只是一种类之间的关系,而不是对象之间的关系。一定要将它和类成员区分开。

作用

  定义一个内部类通常出于以下两个目的:

  1. 让该类可以访问其外部类的所有成员(包括私有),且对其他所有与该类同一个包的类隐藏。

    在Java中,没有友元机制。因此达到这个目的的方法有且只有内部类。

  2. 匿名内部类可以使回调功能的代码更为精简。

    如果某个类的作用仅仅是实现某个接口,并且它只会被实例化一次,那么匿名内部类就会派上用场了(具体用法下面会讲)。

种类

  内部类分为如下几种:

  1. 成员内部类

  2. 局部内部类

  3. 静态内部类

  4. 匿名内部类

  各自的特点和使用方法将在下面一一介绍。

成员内部类

  成员内部类的定义方式大致是:

1 class Outer {2     class Inner{}3 }

  这样定义的内部类能够访问到外部类的所有成员。

局部内部类

  局部内部类的定义方式大致是:

1 class Outer {2     public void doSomething(){3         class Inner{4             public void seeOuter(){5             }6         }7     }8 } 

  局部内部类可以将自己完全的和定义它的方法的外面的世界隔离开。

  同时,它可以访问到外部类的final域。

静态内部类

  如果只是为了实现隐藏功能,不需要访问外部类的对象,那么可以如下方式定义一个静态内部类:

1 class Outer{2     static class Inner{3     }4 }

匿名内部类

  这是一种使用比较多的内部类,能够精简回调使产生的代码。

 1 interface Person { 2     public void eat(); 3 } 4   5 public class Demo { 6     public static void main(String[] args) { 7         Person p = new Person() { 8             public void eat() { 9                 System.out.println("eat something");10             }11         };12         p.eat();13     }14 }

  这样就不用专门为了实现Person接口而再去定义一个新类了。

  但是匿名内部类有一些限制:

  1. 不能有构造方法

  2. 不能有静态域 静态方法

  3. 无权限及static修辞符

小结

  这部分的知识比较杂,不要求一次理解透。多在将来的项目中体会学习即可。

 

内部类