通常状况下是不能够用static修饰类的。若是必定要用static修饰类的话,一般static修饰的是匿名内部类。程序员
在一个类中建立另一个类,叫作成员内部类。这个成员内部类能够静态的(利用static关键字修饰),也能够是非静态的。因为静态的内部类在定义、使用的时候会有种种的限制。因此在实际工做中用到的并很少。测试
在开发过程当中,内部类中使用的最多的仍是非静态地成员内部类。不过在特定的状况下,静态内部类也可以发挥其独特的做用。
1、静态内部类的使用目的。
在定义内部类的时候,能够在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。不过因为种种的缘由,如使用上的限制等等因素(具体的使用限制,笔者在下面的内容中会详细阐述),在实际工做中用的并非不少。可是并非说其没有价值。在某些特殊的状况下,少了这个静态内部类还真是不行。如在进行代码程序测试的时候,若是在每个Java源文件中都设置一个主方法(主方法是某个应用程序的入口,必须具备),那么会出现不少额外的代码。并且最主要的时这段主程序的代码对于Java文件来讲,只是一个形式,其自己并不须要这种主方法。可是少了这个主方法又是万万不行的。在这种状况下,就能够将主方法写入到静态内部类中,从而不用为每一个Java源文件都设置一个相似的主方法。这对于代码测试是很是有用的。在一些中大型的应用程序开发中,则是一个经常使用的技术手段。为此,这个静态内部类虽然不怎么经常使用,可是程序开发人员还必需要掌握它。也许在某个关键的时刻,其还能够发挥巨大的做用也说不定。spa
public class MainInStaticClass {对象
static class Main{开发
static void main() {编译
//将主方法写到静态内部类中,从而没必要为每一个源文件都这种一个相似的主方法class
new MainInStaticClass().print();变量
}权限
}引用
public static void main(String[] args){
new MainInStaticClass().print();
}
public void print(){
System.out.println("main in static inner class");
}
}
public class TestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
// new MainInStaticClass().print();
MainInStaticClass.Main.main();
new MainInStaticClass.Main();
}
}
2、静态内部类的使用限制。
将某个内部类定义为静态类,跟将其余类定义为静态类的方法基本相同,引用规则也基本一致。不过其细节方面仍然有很大的不一样。具体来讲,主要有以下几个地方要引发各位程序开发人员的注意。
一是静态成员(包括静态变量与静态成员)的定义。通常状况下,若是一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不可以被定义成静态成员变量与静态成员方法的。也就是说,在非静态内部类中不能够声明静态成员。如如今在一个student类中定义了一个内部类age,若是没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中若是要利用static关键字来修饰某个成员方法或者成员变量是不容许的。在编译的时候就通不过。故程序开发人员须要注意,只有将某个内部类修饰为静态类,而后才可以在这个类中定义静态的成员变量与成员方法。这是静态内部类都有的一个特性。也正是由于这个缘由,有时候少了这个静态的内部类,不少工做就没法完成。或者说要绕一个大圈才可以实现某个用户的需求。这也是静态的内部类之因此要存在的一个重要缘由。
后注:通过你们的指正,现声明:非静态内部类也能够定义静态成员但须要同时有final关键词修饰,静态方法鉴于没法用final修饰,仍必须是在静态内部类 或者非内部类中定义。
二是在成员的引用上,有比较大的限制。通常的非静态内部类,能够随意的访问外部类中的成员变量与成员方法。即便这些成员方法被修饰为private(私有的成员变量或者方法),其非静态内部类均可以随意的访问。则是非静态内部类的特权。由于在其余类中是没法访问被定义为私有的成员变量或则方法。可是若是一个内部类被定义为静态的,那么在银用外部类的成员方法或则成员变量的时候,就会有诸多的限制。如不可以从静态内部类的对象中访问外部类的非静态成员(包括成员变量与成员方法)。这是什么意思呢?若是在外部类中定义了两个变量,一个是非静态的变量,一个是静态的变量。那么在静态内部类中,不管在成员方法内部仍是在其余地方,都只可以引用外部类中的静态的变量,而不可以访问非静态的变量。在静态内部类中,能够定义静态的方法(也只有在静态的内部类中能够定义静态的方法),在静态方法中引用外部类的成员。可是不管在内部类的什么地方引用,有一个共同点,即都只可以引用外部类中的静态成员方法或者成员变量。对于那些非静态的成员变量与成员方法,在静态内部类中是没法访问的。这就是静态内部类的最大使用限制。在普通的非静态内部类中是没有这个限制的。也正是这个缘由,决定了静态内部类只应用在一些特定的场合。其应用范围远远没有像非静态的内部类那样普遍。
三是在建立静态内部类时不须要将静态内部类的实例绑定在外部类的实例上。
一般状况下,在一个类中建立成员内部类的时候,有一个强制性的规定,即内部类的实例必定要绑定在外部类的实例中。也就是说,在建立内部类以前要先在外部类中要利用new关键字来建立这个内部类的对象。如此的话若是从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。也就是说,普通非静态内部类的对象是依附在外部类对象之中的。可是,若是成员开发人员建立的时静态内部类,那么这就又另当别论了。一般状况下,程序员在定义静态内部类的时候,是不须要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不须要利用关键字new来建立内部类的实例。即在建立静态类内部对象时,不须要其外部类的对象。
new MainInStaticClass.Main();