在一个类中建立另一个类,叫作成员内部类。这个成员内部类能够静态的(利用static关键字修饰),也能够是非静态的。因为静态的内部类在定义、使用的时候会有种种的限制。因此在实际工做中用到的并很少。
在开发过程当中,内部类中使用的最多的仍是非静态地成员内部类。不过在特定的状况下,静态内部类也可以发挥其独特的做用。
1、静态内部类的使用目的。
在定义内部类的时候,能够在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。不过因为种种的缘由,如使用上的限制等等因素(具体的使用限制,笔者在下面的内容中会详细阐述),在实际工做中用的并非不少。可是并非说其没有价值。在某些特殊的状况下,少了这个静态内部类还真是不行。如在进行代码程序测试的时候,若是在每个Java源文件中都设置一个主方法(主方法是某个应用程序的入口,必须具备),那么会出现不少额外的代码。并且最主要的时这段主程序的代码对于Java文件来讲,只是一个形式,其自己并不须要这种主方法。可是少了这个主方法又是万万不行的。在这种状况下,就能够将主方法写入到静态内部类中,从而不用为每一个Java源文件都设置一个相似的主方法。这对于代码测试是很是有用的。在一些中大型的应用程序开发中,则是一个经常使用的技术手段。为此,这个静态内部类虽然不怎么经常使用,可是程序开发人员还必需要掌握它。也许在某个关键的时刻,其还能够发挥巨大的做用也说不定。
2、静态内部类的使用限制。
将某个内部类定义为静态类,跟将其余类定义为静态类的方法基本相同,引用规则也基本一致。不过其细节方面仍然有很大的不一样。具体来讲,主要有以下几个地方要引发各位程序开发人员的注意。
一是静态成员(包括静态变量与静态成员)的定义。通常状况下,若是一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不可以被定义成静态成员变量与静态成员方法的。也就是说,在非静态内部类中不能够声明静态成员。如如今在一个student类中定义了一个内部类age,若是没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中若是要利用static关键字来修饰某个成员方法或者成员变量是不容许的。在编译的时候就通不过。故程序开发人员须要注意,只有将某个内部类修饰为静态类,而后才可以在这个类中定义静态的成员变量与成员方法。这是静态内部类都有的一个特性。也正是由于这个缘由,有时候少了这个静态的内部类,不少工做就没法完成。或者说要绕一个大圈才可以实现某个用户的需求。这也是静态的内部类之因此要存在的一个重要缘由。
二是在成员的引用上,有比较大的限制。通常的非静态内部类,能够随意的访问外部类中的成员变量与成员方法。即便这些成员方法被修饰为private(私有的成员变量或者方法),其非静态内部类均可以随意的访问。则是非静态内部类的特权。由于在其余类中是没法访问被定义为私有的成员变量或则方法。可是若是一个内部类被定义为静态的,那么在银用外部类的成员方法或则成员变量的时候,就会有诸多的限制。如不可以从静态内部类的对象中访问外部类的非静态成员(包括成员变量与成员方法)。这是什么意思呢?若是在外部类中定义了两个变量,一个是非静态的变量,一个是静态的变量。那么在静态内部类中,不管在成员方法内部仍是在其余地方,都只可以引用外部类中的静态的变量,而不可以访问非静态的变量。在静态内部类中,能够定义静态的方法(也只有在静态的内部类中能够定义静态的方法),在静态方法中引用外部类的成员。可是不管在内部类的什么地方引用,有一个共同点,即都只可以引用外部类中的静态成员方法或者成员变量。对于那些非静态的成员变量与成员方法,在静态内部类中是没法访问的。这就是静态内部类的最大使用限制。在普通的非静态内部类中是没有这个限制的。也正是这个缘由,决定了静态内部类只应用在一些特定的场合。其应用范围远远没有像非静态的内部类那样普遍。
三是在建立静态内部类时不须要将静态内部类的实例绑定在外部类的实例上。
一般状况下,在一个类中建立成员内部类的时候,有一个强制性的规定,即内部类的实例必定要绑定在外部类的实例中。也就是说,在建立内部类以前要先在外部类中要利用new关键字来建立这个内部类的对象。如此的话若是从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。也就是说,普通非静态内部类的对象是依附在外部类对象之中的。可是,若是成员开发人员建立的时静态内部类,那么这就又另当别论了。一般状况下,程序员在定义静态内部类的时候,是不须要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不须要利用关键字new来建立内部类的实例。即在建立静态类内部对象时,不须要其外部类的对象。具体为何会这样,通常程序开发人员不须要了解这么深刻,只须要记住有这个规则便可。在定义静态内部类的时候,千万不要犯多此一举的错误。
从以上的分析中能够看出,静态内部类与非静态的内部类仍是有很大的不一样的。通常程序开发人员能够这么理解,非晶态的内部类对象隐式地在外部类中保存了一个引用,指向建立它的外部类对象。无论怎么理解,程序开发人员都须要牢记静态内部类与非静态内部类的差别。如是否能够建立静态的成员方法与成员变量(静态内部类能够建立静态的成员而非静态的内部类不能够)、对于访问外部类的成员的限制(静态内部类只能够访问外部类中的静态成员变量与成员方法而非静态的内部类便可以访问静态的也能够访问非静态的外部类成员方法与成员变量)。这两个差别是静态内部类与非静态外部类最大的差别,也是静态内部类之因此存在的缘由。了解了这个差别以后,程序开发人员还须要知道,在什么状况下该使用静态内部类。如在程序测试的时候,为了不在各个Java源文件中书写主方法的代码,能够将主方法写入到静态内部类中,以减小代码的书写量,让代码更加的简洁。
总之,静态内部类在Java语言中是一个很特殊的类,跟普通的静态类以及非静态的内部类都有很大的差别。做为程序开发人员,必需要知道他们之间的差别,并在实际工做中在合适的地方采用合适的类。不过总的来讲,静态内部类的使用频率并非很高。可是在有一些场合,若是没有这个内部静态类的话,可能会起到事倍功半的反面效果程序员