其实对于Java静态的引入,考虑目标是使用和运行的便捷,不需要再实例化,特别是一些工具性质的代码段。当不用再实例化时,就可以相当于直接使用,增加了公共代码复用的便捷性。
从Java8开始,还支持了静态接口,使得接口的使用更便捷和灵活。另外对于接口还支持了默认方法,也就是如果使用这种定义也可以在方法中加入代码了。接口在程序中的作用越来越重要了。除此之外,Java的static关键字在Java程序中也会经常被用到。
一般来说,Java中的静态概念用于在Java中创建类级别的变量,静态变量和静态方法是类的一部分,而不是类的实例。
Java的静态形式有5中类型:静态变量、静态方法、静态块、内部静态类和静态接口方法(Java8以上支持),下面我们来一一介绍。
我们用Static表示变量的级别,一个类中的静态变量,不属于类的对象或者实例。因为静态变量与所有的对象实例共享,因此他们不具线程安全性。
通常,静态变量常用final关键来修饰,表示通用资源或可以被所有的对象所使用。如果静态变量未被私有化,可以用“类名.变量名”的方式来使用。
//static variable example
private static int count;
public static String str;
public static final String DB_USER = "myuser";
与静态变量一样,静态方法是属于类而不是实例。
一个静态方法只能使用静态变量和调用静态方法。通常静态方法通常用于想给其他的类使用而不需要创建实例。例如:Collections class(类集合)。
Java的包装类和实用类包含许多静态方法。main()方法就是Java程序入口点,是静态方法。
//static method example
public static void setCount(int count) {
if(count > 0)
StaticExample.count = count;
}
//static util method
public static int addInts(int i, int...js){
int sum=i;
for(int x : js) sum+=x;
return sum;
}
从Java8以上版本开始也可以有接口类型的静态方法了。
Java的静态块是一组指令在类装载的时候在内存中由Java ClassLoader执行。
静态块常用于初始化类的静态变量。大多时候还用于在类装载时候创建静态资源。
Java不允许在静态块中使用非静态变量。一个类中可以有多个静态块,尽管这似乎没有什么用。静态块只在类装载入内存时,执行一次。
static{
//can be used to initialize resources when class is loaded
System.out.println("StaticExample static block");
//can access only static variables and methods
str="Test";
setCount(2);
}
Java可以嵌套使用静态类,但是静态类不能用于嵌套的顶层。
静态嵌套类的使用与其他顶层类一样,嵌套只是为了便于项目打包。
让我们来看一个使用静态的样例程序:
StaticExample.java
package com.journaldev.misc;
public class StaticExample {
//static block
static{
//can be used to initialize resources when class is loaded
System.out.println("StaticExample static block");
//can access only static variables and methods
str="Test";
setCount(2);
}
//multiple static blocks in same class
static{
System.out.println("StaticExample static block2");
}
//static variable example
private static int count; //kept private to control it's value through setter
public static String str;
public int getCount() {
return count;
}
//static method example
public static void setCount(int count) {
if(count > 0)
StaticExample.count = count;
}
//static util method
public static int addInts(int i, int...js){
int sum=i;
for(int x : js) sum+=x;
return sum;
}
//static class example - used for packaging convenience only
public static class MyStaticClass{
public int count;
}
}
一般,Java允许用静态成员使用类引用,从Java1.5开始,我们可以使用静态import而不用类引用。下面是一个简单的静态import的例子。
package com.journaldev.test;
public class A {
public static int MAX = 1000;
public static void foo(){
System.out.println("foo static method");
}
}
package com.journaldev.test;
import static com.journaldev.test.A.MAX;
import static com.journaldev.test.A.foo;
public class B {
public static void main(String args[]){
System.out.println(MAX); //normally A.MAX
foo(); // normally A.foo()
}
}
第2段代码用了import语句,导入静态类使用import static,后面跟着的是静态成员的全称。
通过上面的讲述,我们不难发现静态贯穿了整个Java,在Java中扮演着重要角色,我们要彻底弄懂Java中的静态也是殊为不易的,我们可以到动力节点在线观看免费的视频课程,来温故知新,加深我们对Java静态的理解。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54