1、static修饰变量、方法
通常情况下,成员变量、方法都隶属于对象层级,也就是说每个对象都拥有独立的一份,若所有对象的某个特征都是一样的,则会造成内存空间的浪费,为了提高内存空间的利用率可以使用static关键字修饰成员变量、方法,表示静态的概念。此时该成员变量由对象层级提升为类层级,随着类的加载而准备就绪,被所有对象共享,与对象是否创建无关。
使用方式:
(1)使用类名.静态成员的方式进行访问。
(2)对于非静态的成员方法来说,既能访问非静态的成员,也能访问静态的成员。
(3)对于静态成员方法来说,只能访问静态成员,不能访问非静态成员。
(4)在Java语言中static关键字和final关键字很少单独修饰成员变量,通常都是采用public static final 共同修饰成员变量来表示常量的概念,该数值必须指定而且不能更改。通常的命名规范是:所有字母都要大写,不同单词之间采用下划线连接。
2、静态块
静态代码块中的代码在使用类的时候就已经执行了,所以可以应用静态代码块的这个特性来实现单例设计模式(这块在单例设计模式会讲到)。
3、静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
访问静态内部类的方式为:Outter.Inner inner = new Outter.Inner();
4、静态导包
静态导包就是java包的静态导入,用import static代替import。静态导入包是JDK1.5中的新特性。
一般我们导入一个类都用 import com…ClassName;而静态导入是这样:import static com…ClassName.* ;这里的多了个static,还有就是类名ClassName后面多了个.* ,意思是导入这个类里的静态方法。当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了。然后在这个类中,就可以直接用方法名调用静态方法,而不必用ClassName.方法名 的方式来调用。
如上图所示,左边是正常的写法,右边是使用静态导入,两段代码的运行结果是一样的。可以看出使用静态导包后,代码的确简化了,但也降低了可读性。如果对Integer类和Long类执行了静态导入,引用MAX_VALUE将导致一个编译器错误,因为Integer和Long都有一个MAX_VALUE常量,并且Java不会知道你在引用哪个MAX_VALUE。